2013-09-29 11 views
6

Desidero utilizzare la saldatura per l'unità di test CDI. Tuttavia, sono bloccato con questo problema che Weld non può risolvere i bean. Ho creato un mini-progetto per dimostrare il problema con gradle for building.Come testare l'unità CDI con saldatore?

Ho i seguenti file nella cartella <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 

Il contenuto di ogni file è elencato di seguito.

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 (I due beans.xml sotto main/e prova/sono identici.)

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

Quando costruisco il progetto con gradle clean build, ottengo un errore, che viene indicato di seguito. Ho cercato su Google, ma non riuscivo a farlo funzionare.

Grazie mille per il vostro aiuto.

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

La saldatura funziona contro i file JAR, a scopo di scansione. Dovresti considerare l'utilizzo di arquillian per testare questo tipo di tecnologia. –

+0

@ John: Grazie. Sto già provando Arquillian. – JBT

risposta

2

Si dovrebbe dare "ago" una prova: http://needle.spree.de/overview.

Si occupa di semplici compiti di derisione/DI per te e non richiede un contenitore stack completo. Nel tuo caso, si potrebbe utilizzare

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

Ho avuto lo stesso tipo esatto di problema ed è causato dal file META-INF/beans.xml messo in build/resources/invece di build/classes da Gradle.

Weld non eseguirà la scansione delle classi senza il file beans.xml per quanto posso capire.

Una brutta soluzione consiste nel modificare il file build.gradle per copiare i file prima dell'esecuzione del test. Questo funziona per me e non conosco alcun effetto indesiderabile indesiderabile al momento.

Modifiche al file 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

Questo ha funzionato per me. Devo dire che non è necessario includere un bean.xml nelle classi di test, perché sono (almeno dalla versione 2.2.0) automaticamente abilitate al CDI.Vedi https://github.com/BrynCooke/cdi-unit/issues/25. – Rubrick