替代 CDI 实现 - WELD-001408:具有限定符 @Default

我有一个Repository带有两个实现的接口,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);

    }

}

我的beans.xml文件(放在 src/test/webapp/WEB-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_2.xsd"

    bean-discovery-mode="all">

    <alternatives>

        <class>org.package.name.UTRepository</class>

    </alternatives>

</beans>


鸿蒙传说
浏览 138回答 2
2回答

摇曳的蔷薇

您找到的解决方案效果很好,所以只是为了完整性。基本上你需要添加beans.xml这将启用你的选择。EmptyAsset.INSTANCE将导致空的 beans.xml 在这种情况下不会削减它。但是,在您的解决方案中,beans.xml放置在您之下的src/test/webapp/WEB-INF/beans.xml什么都不做。如果要利用现有beans.xml文件,可以使用:addAsManifestResource(File resource, String target)其中添加File了名称为targetaddAsManifestResource(Package resourcePackage, String resourceName, String target)&nbsp;它允许您仅指定文件所在的包,然后是它的名称和文件,您希望在部署中使用它的名称

MMTTMM

问题似乎出在.addAsManifestResource论据上。我必须使用StringAssetArquillian 将添加到 beans.xml 的替代方案,而不是空实例。这是createDeployment()现在的方法:@Deploymentpublic static JavaArchive createDeployment() {&nbsp; &nbsp; return ShrinkWrap.create(JavaArchive.class)&nbsp; &nbsp; &nbsp; &nbsp; .addClasses(Repository.class, UserService.class, UTRepository.class)&nbsp; &nbsp; &nbsp; &nbsp; .addAsManifestResource(new StringAsset("<alternatives><class>org.package.name.repositories.UTRepository</class></alternatives>"), "beans.xml");}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java