2017-03-03 120 views
0

我对cdi或or JUnit Rule(实际上我刚刚发现它们)并不十分熟悉,但我尝试使用embedded-ldap-junit库(基于UnboundID LDAP SDK)在this post之后测试我的ldap api。我确定我的api不是基于UnboundId LDAP SDK!JUnit Rule和cdi

这里是我的代码:

@RunWith(CdiRunner.class) 
public class LdapTest extends TestCase { 
    public static final Logger LOGGER = LoggerFactory.getLogger(LdapTest.class); 
    public static final String DOMAIN_DSN = "dc=my.domain"; 
    public static final String LDIF_FILE = "agents.ldif"; 
    public static final String BPM_SCHEMA = "schema.ldif"; 

    @Inject 
    private LDAPManager ldapManager; 

    @Rule 
    public EmbeddedLdapRule embeddedLdapRule = EmbeddedLdapRuleBuilder.newInstance().usingDomainDsn(DOMAIN_DSN) 
     .importingLdifs(LDIF_FILE).withSchema(BPM_SCHEMA).build(); 

    @Test 
    public void getAgent() throws Exception { 
     embeddedLdapRule.ldapConnection(); 
     DirContext dirContext = embeddedLdapRule.dirContext(); 
     ldapManager.setContext(dirContext); 
     assertNotNull(ldapManager.getAgent("123")); 
    } 
} 

当我尝试运行它,我有以下异常:

org.jboss.weld.exceptions.DefinitionException: WELD-000075 Normal scoped managed bean implementation class has a public field: [email protected] @ApplicationScoped class org.mycompany.LdapTest 
at org.jboss.weld.bean.ManagedBean.checkBeanImplementation(ManagedBean.java:459) 
at org.jboss.weld.bean.AbstractClassBean.initialize(AbstractClassBean.java:176) 
at org.jboss.weld.bean.ManagedBean.initialize(ManagedBean.java:329) 
at org.jboss.weld.bootstrap.AbstractBeanDeployer.deploy(AbstractBeanDeployer.java:117) 
at org.jboss.weld.bootstrap.BeanDeployment.deployBeans(BeanDeployment.java:217) 
at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:357) 
at org.jboss.weld.bootstrap.api.helpers.ForwardingBootstrap.deployBeans(ForwardingBootstrap.java:70) 
at org.jboss.weld.environment.se.Weld.initialize(Weld.java:135) 
at org.jglue.cdiunit.CdiRunner.createTest(CdiRunner.java:94) 
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263) 
at org.jglue.cdiunit.CdiRunner.methodBlock(CdiRunner.java:122) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

我试图在embeddedLdapRule访问级别修饰符玩(私人,/保护/公共)没有成功。你能向我解释我做错了什么吗?非常感谢 !

回答

0

我终于找到了答案:CdiUnit test with Junit @Rule is impossible because of a public private field paradox

因此,解决办法是:

@RunWith(CdiRunner.class) 
public class LdapTest extends TestCase { 
    public static final Logger LOGGER =  LoggerFactory.getLogger(LdapTest.class); 
    public static final String DOMAIN_DSN = "dc=my.domain"; 
    public static final String LDIF_FILE = "agents.ldif"; 
    public static final String BPM_SCHEMA = "schema.ldif"; 

    @Inject 
    private LDAPManager ldapManager; 

    private EmbeddedLdapRule embeddedLdapRule = EmbeddedLdapRuleBuilder.newInstance() 
     .usingDomainDsn(DOMAIN_DSN) 
     .importingLdifs(LDIF_FILE) 
     .withSchema(BPM_SCHEMA) 
     .build(); 

    @Rule 
    public EmbeddedLdapRule getLdapRule() { 
     return embeddedLdapRule; 
    } 

    @Test 
    public void getAgent() throws Exception { 
     embeddedLdapRule.ldapConnection(); 
     DirContext dirContext = embeddedLdapRule.dirContext(); 
     ldapManager.setContext(dirContext); 
     assertNotNull(ldapManager.getAgent("123")); 
    } 
}