Java 替代CDI实施-WELD-001408:使用限定符@Default的类型存储库的未满足依赖项

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

我有一个带有两个实现的接口存储库,DBRepository和UTRepository。UTRepository用@Alternative注释,我正试图在JUnit测试中使用它

测试类:

@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");
}