Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaSE上运行单元测试时使用CDI with Weld的不满意依赖项_Java_Cdi_Weld_Weld Se_Weld Junit5 - Fatal编程技术网

在JavaSE上运行单元测试时使用CDI with Weld的不满意依赖项

在JavaSE上运行单元测试时使用CDI with Weld的不满意依赖项,java,cdi,weld,weld-se,weld-junit5,Java,Cdi,Weld,Weld Se,Weld Junit5,我有一个小项目(JavaSE11.x),我正在用Weld测试CDI。我有这些依赖项(除其他外,这些是与此问题相关的依赖项): 然后我有一个简单的实体类: @实体 @表(name=“拼写书”) 公共最终类SpellBook扩展了AbstractPersistable{ @身份证 @GeneratedValue(generator=“uuid2”) @GenericGenerator(name=“uuid2”,strategy=“uuid2”) @列(name=“id”,nullable=false

我有一个小项目(JavaSE
11.x
),我正在用Weld测试CDI。我有这些依赖项(除其他外,这些是与此问题相关的依赖项):

然后我有一个简单的实体类:

@实体
@表(name=“拼写书”)
公共最终类SpellBook扩展了AbstractPersistable{
@身份证
@GeneratedValue(generator=“uuid2”)
@GenericGenerator(name=“uuid2”,strategy=“uuid2”)
@列(name=“id”,nullable=false,updateable=false)
私有UUID;
@列(name=“name”)
私有字符串名称;
//…一对多和多对多的关系
public SpellBook(){//JPA不需要args构造函数
拼写=新链接列表();
向导=新建链接列表();
}
公共拼写手册(最终字符串名称){
这个();
this.name=名称;
}
公共无效添加(最终法术){
拼写。设置拼写本(本);
拼写。添加(拼写);
}
}
@映射超类
公共抽象类AbstractPersistable实现了可序列化{
@版本
@列(name=“version”)
私人长版;
}
…以及与数据库接口的DAO类:

import jakarta.inject.Singleton;
导入lombok.extern.log4j.Log4j2;
@Log4j2
@独生子女
公共类SpellBookDao扩展了AbstractJpaDao{
公共可选findByName(最终字符串名){
debug(“搜索名为[{}]…”的拼写书,名称);
final var builder=entityManager.getCriteriaBuilder();
最终var条件=builder.createQuery(clazz);
最终var模型=标准。来源(clazz);
选择(model).where(builder.equal(model.get(“name”),name));
返回可选的.ofNullable(entityManager.createQuery(criteria.select(model)).getSingleResult());
}
}
@Log4j2
公共抽象类AbstractJpaDao{
@持久上下文
受保护的实体管理器实体管理器;
保护类clazz;
公共无效课程设置(最终课程设置){
this.clazz=clazz;
}
//…persist、merge、findAll、findOne等的一些默认值。
}
我想做的是为DAO类编写一个简单的单元测试:

import jakarta.inject.inject;
导入org.acme.service_layer.persistence.SpellBookDao;
导入org.assertj.core.api.Assertions;
导入org.jboss.weld.junit5.EnableWeld;
导入org.junit.jupiter.api.Disabled;
导入org.junit.jupiter.api.Test;
导入java.util.UUID;
@使能焊接
期末考试{
@注入
私家书道;
@试验
void findByName_when nspellbookexists(){
final var optional=dao.findByName(“黑魔王升天”);
Assertions.assertThat(可选)
.hasvalues(它->{
assertThat(it.getId()).isEqualTo(UUID.fromString(“715811c9-ae11-41ec-8652-671fd88cd2a0”);
Assertions.assertThat(it.getName()).isEqualTo(“黑魔王升天”);
Assertions.assertThat(it.getSpells()).isEmpty();
Assertions.assertThat(it.getWizards()).isEmpty();
// ...
assertThat(it.getVersion()).isEqualTo(0L);
});
}
}
此堆栈跟踪始终失败:

WELD-001408:SpellBookDao类型与限定符@Default的未满足依赖关系
在注入点[BackedAnnotatedField]@injectprivate org.acme.service\u layer.persistence.internal.SpellBookDaoTest.dao
位于org.acme.service_layer.persistence.internal.SpellBookDaoTest.dao(SpellBookDaoTest.java:0)
org.jboss.weld.exceptions.DeploymentException:weld-001408:带限定符@Default的SpellBookDao类型的未满足依赖项
在注入点[BackedAnnotatedField]@injectprivate org.acme.service\u layer.persistence.internal.SpellBookDaoTest.dao
位于org.acme.service_layer.persistence.internal.SpellBookDaoTest.dao(SpellBookDaoTest.java:0)
位于org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:378)
……这里还有很多
我已经搜索了很多类似的问题/答案,但仍然无法找出我在这里做错了什么。有什么建议吗

顺便说一下,我有一个
main/resources/META-INF/beans.xml
test/resources/META-INF/beans.xml
。两者的内容相同:


我认为如果您没有使用范围注释对至少一个进行注释,CDI就无法提供实现。 将@ApplicationScoped或@Singleton放在SpellBookDao上

刚刚看到您已经设置了bean discovery mode=“all”,应该可以正常工作

[编辑]

Add to your gradle
test.doFirst {
    copy {
        from 'build/resources/main/META-INF/beans.xml'
        into 'build/classes/main/META-INF/'
    }
    copy {
        from 'build/resources/test/META-INF/beans.xml'
        into 'build/classes/test/META-INF/'
    }
}

更改您的测试:

@ExtendWith(WeldJunit5Extension.class)
final class SpellBookDaoTest {

  @WeldSetup
  WeldInitiator weldInitiator =  WeldInitiator.of(SpellBookDao.class);
将依赖项添加到gralde配置中的API: `测试实现(“javax:javaeeapi:8.0.1”)``

你的豆子会被找到的。 现在您必须提供EntityManager

这里是医生

正如我在本问题的中所述-这是一个问题,因为截至今天(2021年2月23日),
weld junit
版本
2.x
已设置为与Java/Jakarta EE 8一起使用。我需要为Jakarta EE 9及其
Jakarta
名称空间发布一个新的主要版本,该名称空间由Weld 4实现。这应该不会太难,我希望能在一两周内找到时间

编辑:weld junit 3.0.0.Final版现已在Central中提供,旨在与雅加达EE 9名称空间配合使用,因此上述问题应得到有效解决

在此之前,如果您使用EE8的
javax
名称空间交换到EE8,并且还使用实现该名称空间的weld 3,则只能使用
weld junit


最后但并非最不重要的一点是,您的项目混淆了EE 8和EE 9工件-这是您需要解决的一个问题,主要是由于两者之间的名称空间差异,并且即使在我们修复
weld junit

之后,仍然会导致问题。不幸的是,它也不起作用。我有
@Singleton
,但直到现在才尝试
@ApplicationScoped
。它没有改变任何东西。请查看我的编辑
@ExtendWith(WeldJunit5Extension.class)
final class SpellBookDaoTest {

  @WeldSetup
  WeldInitiator weldInitiator =  WeldInitiator.of(SpellBookDao.class);