2013-10-23 97 views
2

我們希望使用Jglue框架來單元測試我們的CDI應用程序。我們使用gradle來建造。單元測試CDI與CDI單元Jglue

我們準備了這樣的事情:

1)班進行測試:

@Default 
public class RateTypeHibernateFactory implements RateTypeFactory { 

@Override 
public RateType getInstance(String name, String description) { 
    RateType rateType = getInstance(); 
    rateType.setName(name); 
    rateType.setDescription(description); 
    return rateType; 
} 

} 

2)接口:

public interface RateTypeFactory { 

public RateType getInstance(String name, String description); 

} 

3)搖籃設置(我們遵循入門http://jglue.org/cdi-unit/

dependencies { 

    testCompile (group: 'junit', name: 'junit', version: '4.8.2') 
    testCompile (group: 'org.jglue.cdi-unit', name: 'cdi-unit', version: '2.2.0') 

} 

4)測試類:

@RunWith(CdiRunner.class) 
public class RateTypeFactoryTest { 

@Inject RateTypeFactory rateTypeFactory; 

@Test 
public void testGetInstance() { 
    RateType rateType = rateTypeFactory.getInstance(); 
    assertNotNull(rateType); 
} 

} 

當我們運行這個簡單的測試中,我們始終得到此異常:

com.etnetera.projects.ticketing.model.factory.RateTypeFactoryTest > testGetInstance FAILED 
java.lang.NoSuchMethodError 

1 test completed, 1 failed 
:test FAILED 

在/build/reports/tests/index.html有:

java.lang.NoSuchMethodError: org.jboss.weld.metadata.BeansXmlImpl.<init>(Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/jboss/weld/bootstrap/spi/Scanning;Ljava/net/URL;Lorg/jboss/weld/bootstrap/spi/BeanDiscoveryMode;Ljava/lang/String;)V 
at org.jglue.cdiunit.internal.WeldTestUrlDeployment.<init>(WeldTestUrlDeployment.java:80) 
at org.jglue.cdiunit.CdiRunner$1.createDeployment(CdiRunner.java:71) 
at org.jboss.weld.environment.se.Weld.initialize(Weld.java:137) 
at org.jglue.cdiunit.CdiRunner.createTest(CdiRunner.java:82) 
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:258) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:255) 
at org.jglue.cdiunit.CdiRunner.methodBlock(CdiRunner.java:113) 
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:55) 
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:42) 
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:71) 
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:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
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 $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:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
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$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:662) 

請沒有任何人知道如何避免這種例外?如果需要,我可以添加更多的細節。

+0

你運行對什麼版本的焊縫的提取物? –

+0

我的焊縫版本是1.1.8。 –

+0

1.1.8應與2.1.1 工作,如果你仍然有問題,那麼請提高對問題跟蹤了一個錯誤:https://github.com/BrynCooke/cdi-unit/issues?state=open – Bryn

回答

1

這通常是由焊接的不支持的版本引起的被使用。 但是,我剛剛發佈了CDI-Unit 2.2.1,它修復了Gradle構建中的一些問題。 請你可以試試嗎?

+0

還要檢查出Gradle示例項目: https://github.com/BrynCooke/cdi-unit/tree/master/cdi-unit-tests-gradle – Bryn

0

似乎你調用該接口上的一個方法沒有參數。 而不是 RateType rateType = rateTypeFactory.getInstance(); 你應該叫 RateType rateType = rateTypeFactory.getInstance("name", "description");

也許我錯過了什麼gradle這個有關?

0

我也遇到了類似的問題(一個錯誤信息有點不同)。我圍繞這個問題搜索了很多東西,但沒有發現太多關於這個問題,所以我得出結論,這是我的項目特有的。這導致我懷疑項目依賴關係之間的版本不匹配。

我使用weld-servlet: 2.4.0.Final作爲compile依賴項,而cdi-unit: 3.1.4作爲test依賴項。我注意到cdi-unitweld-se-core: 2.3.2.Final有依賴。因此,我將weld-se-core添加到我的依賴管理中,其版本與我的weld-servlet工件相同,並解決了問題。

有關進一步的參考,這是我pom.xml文件

<properties> 
    <weld.version>2.4.0.Final</weld.version> 
    <cdi-unit.version>3.1.4</cdi-unit.version> 
    (...) 
</properties> 

<dependencyManagement> 
    <dependencies> 
     <!-- CDI --> 
     <dependency> 
      <groupId>org.jboss.weld.servlet</groupId> 
      <artifactId>weld-servlet</artifactId> 
      <version>${weld.version}</version> 
     </dependency> 
     <!-- Tests --> 
     <dependency> 
      <groupId>org.jglue.cdi-unit</groupId> 
      <artifactId>cdi-unit</artifactId> 
      <version>${cdi-unit.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.jboss.weld.se</groupId> 
      <artifactId>weld-se-core</artifactId> 
      <version>${weld.version}</version> 
      <scope>test</scope> 
     </dependency> 
     (...) 
    </dependencies> 
</dependencyManagement> 

<dependencies> 
    <!-- CDI --> 
    <dependency> 
     <groupId>org.jboss.weld.servlet</groupId> 
     <artifactId>weld-servlet</artifactId> 
    </dependency> 
    <!-- Tests --> 
    <dependency> 
     <groupId>org.jglue.cdi-unit</groupId> 
     <artifactId>cdi-unit</artifactId> 
    </dependency> 
    (...) 
</dependencies>