集成测试期间与 Weld 的不满足依赖关系
Unsatisfied dependencies with Weld during integration testing
我能够部署一个与 Weld 配合良好的 RESTEasy 应用程序(这意味着我的 CDI 可以正常工作)但是我在集成测试中遇到了一些问题。我收到此错误:
org.jboss.weld.exceptions.DeploymentException:
WELD-001408: Unsatisfied dependencies for type SomeService with qualifiers @Default
测试时:
@RunWith(WeldJUnit4Runner.class)
public class SomeServiceIT {
@Inject
private SomeService service;
@Test
public void test() {
System.out.println(service);
}
}
我日志中的最后一条消息是
DEBUG::WELD-000100: Weld initialized. Validating beans
src/test/resources/META-INF/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>
顺便说一下,我尝试了 cdi-unit
库并且它可以工作,但我需要使用我自己的 WeldJUnit4Runner
,目前是:
public class WeldJUnit4Runner extends BlockJUnit4ClassRunner {
private final Weld weld;
private final WeldContainer container;
public WeldJUnit4Runner(Class<?> klass) throws InitializationError {
super(klass);
this.weld = new Weld();
this.container = weld.initialize();
}
@Override
protected Object createTest() throws Exception {
return container.instance().select(getTestClass().getJavaClass()).get();
}
}
我使用 weld-se
2.4.1.Final 进行测试。
谢谢。
编辑:
因此,Weld 似乎只查看 src/test/java(当我将 SomeService 复制到 src/test/java 时,它起作用了)。这很愚蠢,我不会复制我所有的 类 来测试它们...如何告诉 Weld 从 src/main/java?
中检索 类
抱歉,我没有解决方案,只有一个小线索:如果您想对 BlockJUnit4ClassRunner
进行一些自定义 - 为什么不尝试扩展 org.jglue.cdiunit.CdiRunner
或 org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner
?或者至少看看他们的源代码。
Ps。我总是发现 Weld 的 class-path 扫描脆弱且容易出错。并尽量避免它。
它应该可以工作,所以我 post 这里是我所做的。
首先,我使用:
- 日蚀月神
- JDK 7
我的项目树如下:
这是我的 pom 依赖项:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
<version>2.4.1.Final</version>
<scope>test</scope>
</dependency>
SomeService
界面:
package org.jvi.cdirunner;
public interface SomeService {
void test();
}
SomeServiceImpl
实施:
package org.jvi.cdirunner;
public class SomeServiceImpl implements SomeService {
@Override
public void test() {
// TODO Auto-generated method stub
}
}
测试 运行 :
package org.jvi.cdirunner.test;
import javax.inject.Inject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.jvi.cdirunner.SomeService;
@RunWith(WeldJUnit4Runner.class)
public class SomeServiceIT {
@Inject
private SomeService service;
@Test
public void test() {
System.out.println(service);
}
}
如果我 运行 在 Eclipse 下测试,一切正常。我不明白为什么它对你不起作用。
所以我能够通过在现有 src/main/webapp/WEB-INF/beans.xml
和 src/test/resources/META-INF/beans.xml
之外创建 src/main/resources/META-INF/beans.xml
来使其工作,这意味着现在我在同一个项目中有 3 倍的完全相同的文件我觉得这很愚蠢,但我想这就是焊接世界的样子......
感谢大家的宝贵时间。
编辑:
实际上我只能用 src/main/resources/META-INF/beans.xml
部署应用程序(我删除了 src/main/webapp/WEB-INF/beans.xml
)
我能够部署一个与 Weld 配合良好的 RESTEasy 应用程序(这意味着我的 CDI 可以正常工作)但是我在集成测试中遇到了一些问题。我收到此错误:
org.jboss.weld.exceptions.DeploymentException:
WELD-001408: Unsatisfied dependencies for type SomeService with qualifiers @Default
测试时:
@RunWith(WeldJUnit4Runner.class)
public class SomeServiceIT {
@Inject
private SomeService service;
@Test
public void test() {
System.out.println(service);
}
}
我日志中的最后一条消息是
DEBUG::WELD-000100: Weld initialized. Validating beans
src/test/resources/META-INF/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>
顺便说一下,我尝试了 cdi-unit
库并且它可以工作,但我需要使用我自己的 WeldJUnit4Runner
,目前是:
public class WeldJUnit4Runner extends BlockJUnit4ClassRunner {
private final Weld weld;
private final WeldContainer container;
public WeldJUnit4Runner(Class<?> klass) throws InitializationError {
super(klass);
this.weld = new Weld();
this.container = weld.initialize();
}
@Override
protected Object createTest() throws Exception {
return container.instance().select(getTestClass().getJavaClass()).get();
}
}
我使用 weld-se
2.4.1.Final 进行测试。
谢谢。
编辑:
因此,Weld 似乎只查看 src/test/java(当我将 SomeService 复制到 src/test/java 时,它起作用了)。这很愚蠢,我不会复制我所有的 类 来测试它们...如何告诉 Weld 从 src/main/java?
抱歉,我没有解决方案,只有一个小线索:如果您想对 BlockJUnit4ClassRunner
进行一些自定义 - 为什么不尝试扩展 org.jglue.cdiunit.CdiRunner
或 org.apache.deltaspike.testcontrol.api.junit.CdiTestRunner
?或者至少看看他们的源代码。
Ps。我总是发现 Weld 的 class-path 扫描脆弱且容易出错。并尽量避免它。
它应该可以工作,所以我 post 这里是我所做的。
首先,我使用:
- 日蚀月神
- JDK 7
我的项目树如下:
这是我的 pom 依赖项:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
<version>2.4.1.Final</version>
<scope>test</scope>
</dependency>
SomeService
界面:
package org.jvi.cdirunner;
public interface SomeService {
void test();
}
SomeServiceImpl
实施:
package org.jvi.cdirunner;
public class SomeServiceImpl implements SomeService {
@Override
public void test() {
// TODO Auto-generated method stub
}
}
测试 运行 :
package org.jvi.cdirunner.test;
import javax.inject.Inject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.jvi.cdirunner.SomeService;
@RunWith(WeldJUnit4Runner.class)
public class SomeServiceIT {
@Inject
private SomeService service;
@Test
public void test() {
System.out.println(service);
}
}
如果我 运行 在 Eclipse 下测试,一切正常。我不明白为什么它对你不起作用。
所以我能够通过在现有 src/main/webapp/WEB-INF/beans.xml
和 src/test/resources/META-INF/beans.xml
之外创建 src/main/resources/META-INF/beans.xml
来使其工作,这意味着现在我在同一个项目中有 3 倍的完全相同的文件我觉得这很愚蠢,但我想这就是焊接世界的样子......
感谢大家的宝贵时间。
编辑:
实际上我只能用 src/main/resources/META-INF/beans.xml
部署应用程序(我删除了 src/main/webapp/WEB-INF/beans.xml
)