001 package org.picocontainer.alternatives.issues;
002
003 import junit.framework.TestCase;
004
005 import org.picocontainer.MutablePicoContainer;
006 import org.picocontainer.alternatives.ImplementationHidingPicoContainer;
007 import org.picocontainer.defaults.VerifyingVisitor;
008
009 public class Issue0214TestCase extends TestCase {
010
011 // This bug as described in the bug report, http://jira.codehaus.org/browse/PICO-214, cannot be reproduced.
012 public void testTheBug() {
013 final MutablePicoContainer pico = new ImplementationHidingPicoContainer();
014 pico.registerComponentImplementation(A.class);
015
016 /* This is a workaround for the bug described further down. Normally
017 * this method call should only be needed if specific requirements for
018 * parameters exist, but not if PicoContainer shall resolve the
019 * dependencies itself. However, with ImplementationHidingPicoContainer
020 * this is currently the only way to register a class/interface such
021 * that the automatic resolution works.
022 */
023 pico.registerComponentImplementation(I1.class, B.class, null);
024
025 /* The following registerComponentImplementation(Object, Class) of
026 * ImplementationHidingPicoContainer is buggy, as it contains
027 * "ComponentAdapter delegate = caf.createComponentAdapter(componentKey,
028 * componentImplementation, new Parameter[0]);". Instead of "new
029 * Parameter[0]" it should be "null" to have a behaviour consistent to
030 * DefaultPicoContainer, i.e. if PicoContainer shall resolve
031 * dependencies itself.
032 */
033 pico.registerComponentImplementation(I2.class, C.class);
034
035 /* The following verify() throws the exception, but is expected not to
036 * throw: "org.picocontainer.PicoVerificationException:
037 * [[org.picocontainer.PicoInitializationException: Either do the
038 * specified parameters not match any of the following constructors:
039 * [public PicoContainerBugTest$C(PicoContainerBugTest$A)] or the
040 * constructors were not accessible for 'class
041 * PicoContainerBugTest$C']]".
042 *
043 * I believe that the error comes this way: In method
044 * getGreediestSatisfiableConstructor parameters are checked against
045 * null and if parameters is not null it is assumed that specific
046 * parameters have been given so that no automatic resolution takes
047 * place. As now during registration instead of "null" falsly "new
048 * Parameter[0]" was stored, this is now interpreted as if only the
049 * nullary constructor shall be used, and if that doesn't exist, the
050 * exception is thrown.
051 */
052 new VerifyingVisitor().traverse(pico);
053 }
054
055 public static interface I1 {
056 }
057
058 public static interface I2 {
059 }
060
061 public static class A {
062 public A() {
063 }
064 }
065
066 public static class B implements I1 {
067 public B(final A a) {
068 }
069 }
070
071 public static class C implements I2 {
072 public C(final A a) {
073 }
074 }
075 }