Unit testing 使用CDI单元Jglue进行单元测试CDI

Unit testing 使用CDI单元Jglue进行单元测试CDI,unit-testing,gradle,cdi,weld,cdi-unit,Unit Testing,Gradle,Cdi,Weld,Cdi Unit,我们希望使用Jglue框架对CDI应用程序进行单元测试。我们用梯度来建造 我们准备了这样的东西: 1) 要测试的类: @Default public class RateTypeHibernateFactory implements RateTypeFactory { @Override public RateType getInstance(String name, String description) { RateType rateType = getInstance();

我们希望使用Jglue框架对CDI应用程序进行单元测试。我们用梯度来建造

我们准备了这样的东西:

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) 渐变设置(我们关注入门)

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)
java.lang.NoSuchMethodError:org.jboss.weld.metadata.BeansXmlImpl(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
位于org.jglue.cdiunit.internal.WeldTestUrlDeployment。(WeldTestUrlDeployment.java:80)
位于org.jglue.cdiunit.CdiRunner$1.createDeployment(CdiRunner.java:71)
在org.jboss.weld.environment.se.weld.initialize(weld.java:137)上
位于org.jglue.cdiunit.CdiRunner.createTest(CdiRunner.java:82)
位于org.junit.runners.BlockJUnit4ClassRunner$1.runReflectCall(BlockJUnit4ClassRunner.java:258)
位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
位于org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:255)
位于org.jglue.cdiunit.CdiRunner.methodBlock(CdiRunner.java:113)
位于org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
位于org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
访问org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
位于org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
位于org.junit.runners.ParentRunner.run(ParentRunner.java:236)
位于org.gradle.api.internal.tasks.testing.junit.junitsetclassexecuter.runTestClass(junitsetclassexecuter.java:55)
位于org.gradle.api.internal.tasks.testing.junit.junitsetclassexecuter.execute(junitsetclassexecuter.java:42)
位于org.gradle.api.internal.tasks.testing.junit.junitestclassprocessor.processTestClass(junitestclassprocessor.java:71)
位于org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:49)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
位于org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
位于org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
位于org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
位于$Proxy2.processTestClass(未知源)
位于org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:103)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
位于org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
位于org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:355)
位于org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:66)
位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
运行(Thread.java:662)

请问有人知道如何避免这种例外吗?如果需要,我可以添加更多细节。

这通常是由于使用了不受支持的焊接版本。 然而,我刚刚发布了CDI单元2.2.1,它修复了Gradle构建中的几个问题。
请您试一试好吗?

您似乎在调用接口上没有参数的方法。 而不是
RateType RateType=rateTypeFactory.getInstance()
你也许应该打电话
RateType RateType=rateTypeFactory.getInstance(“名称”、“说明”)


也许我错过了一些与gradle有关的内容?

我遇到了类似的问题(错误消息稍有不同)。我在谷歌上搜索了很多关于这个问题的信息,但并没有找到太多关于这个问题的信息,所以我得出结论,这是针对我的项目的。这使我怀疑项目的依赖项之间存在版本不匹配

我使用的是
weldservlet:2.4.0.Final
作为
编译
依赖项,而
cdi单元:3.1.4
作为
测试
依赖项。我注意到
cdi单元
依赖于
weld se core:2.3.2.Final
。因此,我使用与我的
weldservlet
工件相同的版本将
weldse-core
添加到依赖关系管理中,解决了这个问题

为了进一步参考,这里是我的
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>

2.4.0.1最终版本
3.1.4
(...)
org.jboss.weld.servlet
焊接servlet
${weld.version}
org.jglue.cdi-unit
cdi单元
${cdi unit.version}
测试
org.jboss.weld.se
焊接se型芯
${weld.version}
测试
(...)
org.jboss.we
<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>