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.