Java 替代CDI实施-WELD-001408:使用限定符@Default的类型存储库的未满足依赖项
我有一个带有两个实现的接口存储库,DBRepository和UTRepository。UTRepository用@Alternative注释,我正试图在JUnit测试中使用它 测试类:Java 替代CDI实施-WELD-001408:使用限定符@Default的类型存储库的未满足依赖项,java,jakarta-ee,java-ee-7,jboss-arquillian,weld,Java,Jakarta Ee,Java Ee 7,Jboss Arquillian,Weld,我有一个带有两个实现的接口存储库,DBRepository和UTRepository。UTRepository用@Alternative注释,我正试图在JUnit测试中使用它 测试类: @RunWith(Arquillian.class) public class UserServiceTest { @Inject private UserService service; @Deployment public static JavaArchive createD
@RunWith(Arquillian.class)
public class UserServiceTest {
@Inject
private UserService service;
@Deployment
public static JavaArchive createDeployment() {
return ShrinkWrap.create(JavaArchive.class)
.addClasses(Repository.class, UserService.class, UTRepository.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}
@Test
public void addCharacterTest() {
service.addCharacter(1L, Mockito.mock(GameCharacter.class));
}
}
被测类别:
public class UserService {
@Inject
Repository repository;
@Transactional
public void addCharacter(Long userId, GameCharacter character) {
User user = repository.readById(userId, User.class);
user.addCharacter(character);
repository.update(user);
}
}
放置在src/test/webapp/WEB-INF/beans.xml中的My 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_2.xsd"
bean-discovery-mode="all">
<alternatives>
<class>org.package.name.UTRepository</class>
</alternatives>
</beans>
问题是什么?问题似乎是.addAsManifestResource参数。我必须将StringAsset与Arquillian将添加到beans.xml的备选方案一起使用,而不是一个空实例 这是createDeployment方法:
@Deployment
public static JavaArchive createDeployment() {
return ShrinkWrap.create(JavaArchive.class)
.addClasses(Repository.class, UserService.class, UTRepository.class)
.addAsManifestResource(new StringAsset("<alternatives><class>org.package.name.repositories.UTRepository</class></alternatives>"), "beans.xml");
}
您找到的解决方案效果很好,因此只需考虑完整性 基本上,您需要添加beans.xml,这将支持您的替代方案。INSTANCE将生成空的beans.xml,在这种情况下,它不会剪切它 但是,在您的解决方案中,放在src/test/webapp/WEB-INF/beans.xml下的beans.xml没有任何作用。如果要利用现有的beans.xml文件,可以使用: addAsManifestResourceFile资源,字符串目标,将给定文件添加为目标名称 addAsManifestResourcePackage resourcePackage、String resourceName、String target,允许您仅指定文件所在的包,然后指定其名称和文件名,以便在部署中使用该文件
@Deployment
public static JavaArchive createDeployment() {
return ShrinkWrap.create(JavaArchive.class)
.addClasses(Repository.class, UserService.class, UTRepository.class)
.addAsManifestResource(new StringAsset("<alternatives><class>org.package.name.repositories.UTRepository</class></alternatives>"), "beans.xml");
}