如何用焊接单元测试CDI?

时间:2013-09-29 17:02:39

标签: java-ee cdi jboss-weld weld

我想使用weld-se进行单元测试CDI。但是,我坚持这个Weld无法解决bean的问题。我创建了一个小型项目来演示用于构建gradle的问题。

我在<project-root>文件夹中有以下文件:

./build.gradle
./src/main/java/cdi/Book.java
./src/main/resources/META-INF/beans.xml
./src/test/java/cdi/BookTest.java
./src/test/resources/META-INF/beans.xml

下面列出了每个文件的内容。

的build.gradle

apply plugin: 'java'    
repositories {
    mavenCentral()
}    
dependencies {
    compile 'org.jboss.weld.se:weld-se:2.0.4.Final'
    testCompile 'junit:junit:4.11'
}

Book.java

package cdi;    
public class Book {
    private String title;    
    public String getTitle() {
        return title;
    }    
    public void setTitle(String title) {
        this.title = title;
    }
}

BookTest.java

package cdi;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class BookTest {
    private static Weld weld;
    private static WeldContainer weldContainer;

    @BeforeClass
    public static void setupClass() {
        weld = new Weld();
        weldContainer = weld.initialize();
    }

    @AfterClass
    public static void teardownClass() {
        weld.shutdown();
    }

    @Test
    public void dummyTest() {
        Book book = weldContainer.instance().select(Book.class).get();
        book.setTitle( "foobar");
        assertEquals("foobar", book.getTitle());
    }
}

beans.xml (main /和test /下的两个beans.xml相同。)

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                           http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.1" bean-discovery-mode="all">
</beans>

当我使用gradle clean build构建项目时,出现错误,如下所示。我用Google搜索,但无法使其正常工作。

非常感谢你的帮助。

org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001308 Unable to resolve any beans for Types: [class cdi.Book]; Bindings: [QualifierInstance{annotationClass=interface javax.enterprise.inject.Any, values={}, hashCode=868729182}]
    at org.jboss.weld.manager.BeanManagerImpl.getBean(BeanManagerImpl.java:824)
    at org.jboss.weld.bean.builtin.InstanceImpl.get(InstanceImpl.java:78)
    at cdi.BookTest.dummyTest(BookTest.java:29)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:80)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:47)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:69)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:49)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:103)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:355)
    at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:66)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

3 个答案:

答案 0 :(得分:9)

我遇到了完全相同类型的问题,这是由于Gradle将META-INF / beans.xml文件放入build / resources /而不是build / classes。

据我所知,Weld不会在没有beans.xml文件的情况下扫描类。

一个丑陋的修复方法是更改​​build.gradle文件以在运行测试之前复制文件。这对我有用,我不知道目前有任何不良副作用。

Gradle文件的更改。

test.doFirst {
    copy {
        from 'build/resources/main/META-INF/beans.xml'
        into 'build/classes/main/META-INF/'
    }
    copy {
        from 'build/resources/test/META-INF/beans.xml'
        into 'build/classes/test/META-INF/'
    }
}

答案 1 :(得分:3)

我也创建了CDI-Unit http://jglue.org/cdi-unit/

源树中有一个示例gradle项目: https://github.com/BrynCooke/cdi-unit/tree/master/cdi-unit-tests-gradle

答案 2 :(得分:2)

你应该尝试“针”:http://needle.spree.de/overview

它可以为您完成简单的模拟/ DI任务,并且不需要完整的堆栈容器。 在您的情况下,您可以使用

@Rule
public final NeedleRule needle = new NeedleRule();
@Inject
private Book book;
...