A test-case class is directly instantiating a PicoContainer and registering components within it.
Its too easy to use a PicoContainer instance and setup the component to test with it
It goes really bad when you're setting up consequential transitive dependencies For example:
public void testCocktailWithVodkaIsAlcoholic() {
DefaultPicoContainer container = new DefaultPicoContainer();
container.addComponent(Cocktail.class, BananaPopsicleCocktail.class);
// needed by Cocktail
container.addComponent(BananaLiqueur.class);
container.addComponent(OrangeJuice.class);
container.addComponent(PineappleJuice.class);
container.addComponent(VanillaVodka.class);
// needed by Cocktail's ingredients
container.addComponent(LiqueurMaker.class);
container.addComponent(StolichnayaDistillery.class);
container.addComponent(FruitJuiceDistributor.class);
Cocktail cocktail = container.getComponent(Cocktail.class);
assertTrue(cocktail.isAlcoholic());
}
For unit tests like this, the class being tested should be instantiated directly by the test. Mock Objects should be used to "mock" the dependent objects, i.e. supplying a fake implementation that can have expectations set and verified on it, rather than a real implementation. So, the test becomes:
public void testCocktailWithVodkaIsAlcoholic() {
BananaLiqueur bl = mock(BananaLiqueur.class);
OrangeJuice oj = mock(OrangeJuice.class);
PineappleJuice pj = mock(PineappleJuice.class);
VanillaVodka vv = mock(VanillaVodka.class);
// set expectations these four according to your mocking framework
Cocktail cocktail = new BananaPopsicleCocktail(bl, oj, pj, vv);
assertTrue(cocktail.isAlcoholic());
// verify expectations on the four mocks here.
}
The implementation details of creating a mock object and setting and verifying expectations have been left out of the example, as the details depend on which mock object library/technique is used. Search for EasyMock, JMock or Mockito in Google.
The container has to be instantiated somewhere of course.
A common place to instantiate containers is in some bootstrap class in the application.
There may be a requirement to write a high-level "functional" test, in which you wish to test the interactions between a set of real components (not mocks). In this case, you may wish to create a container with the appropriate components registered for your test.
If you are using NanoContainer, you can use NanoContainer's Standalone class (a bootstrapper) to start the application. All the container configuration can live in a script and NanoContainer (and thereby PicoContainer(s)) will be instantiated.