2013-09-29 15 views
6

Tôi muốn sử dụng hàn-se để kiểm tra đơn vị CDI. Tuy nhiên, tôi đang mắc kẹt với vấn đề này mà Weld không thể giải quyết đậu. Tôi đã tạo ra một mini-project để chứng minh vấn đề với gradle để xây dựng.Làm thế nào để kiểm tra đơn vị CDI với mối hàn?

Tôi có những file sau trong thư mục <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 

Nội dung của mỗi tập tin được liệt kê dưới đây.

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 (Hai beans.xml dưới chính/và thử nghiệm/giống hệt nhau.)

<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> 

Khi tôi xây dựng dự án với gradle clean build, tôi nhận được một lỗi, được liệt kê dưới đây. Tôi googled xung quanh, nhưng không thể làm cho nó hoạt động.

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn.

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) 
+1

Hoạt động chống lại các tệp JAR, vì mục đích quét. Bạn nên cân nhắc sử dụng arquillian để kiểm tra loại công nghệ này. –

+0

@John: Cảm ơn. Tôi đã thử Arquillian rồi. – JBT

Trả lời

2

Bạn nên thử "kim": http://needle.spree.de/overview.

Nó sẽ chăm sóc các nhiệm vụ nhạo báng/DI đơn giản cho bạn và không yêu cầu ngăn xếp ngăn xếp đầy đủ. Trong trường hợp của bạn, bạn chỉ có thể sử dụng

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

tôi đã có cùng một loại chính xác của vấn đề và nó được gây ra bởi các tập tin META-INF/beans.xml được đưa vào xây dựng/tài nguyên/thay vì xây dựng/lớp học của Gradle.

Weld sẽ không quét các lớp mà không có tệp beans.xml theo như tôi có thể hiểu được.

Sửa lỗi xấu là thay đổi tệp build.gradle để sao chép tệp trước khi chạy thử nghiệm. Điều này làm việc cho tôi và tôi không biết về bất kỳ tác dụng phụ không thể hiểu được vào lúc này.

Thay đổi đối với tệp 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/' 
    } 
} 
+0

Điều này làm việc cho tôi. Tôi nên đề cập đến rằng nó không cần thiết để bao gồm một beans.xml trong các lớp thử nghiệm, bởi vì chúng (ít nhất là từ phiên bản 2.2.0) tự động bật CDI.Xem https://github.com/BrynCooke/cdi-unit/issues/25. – Rubrick

Các vấn đề liên quan