Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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
Java 在使用Spring Boot执行@WebMvcTest时,是否有方法将EntityManager的实例注入到自定义bean验证程序中?_Java_Spring Boot_Bean Validation_Entitymanager_Spring Boot Test - Fatal编程技术网

Java 在使用Spring Boot执行@WebMvcTest时,是否有方法将EntityManager的实例注入到自定义bean验证程序中?

Java 在使用Spring Boot执行@WebMvcTest时,是否有方法将EntityManager的实例注入到自定义bean验证程序中?,java,spring-boot,bean-validation,entitymanager,spring-boot-test,Java,Spring Boot,Bean Validation,Entitymanager,Spring Boot Test,我创建了一个自定义bean验证器,如下所示: 公共类UniqueValidator实现ConstraintValidator{ 私人最终实体管理人实体管理人; 私有类实体类; 私有字符串实体字段; 公共唯一验证程序(EntityManager EntityManager){ this.entityManager=entityManager; } 公共无效初始化(唯一约束){ entityClass=constraint.entityClass(); entityField=约束。entityFi

我创建了一个自定义bean验证器,如下所示:

公共类UniqueValidator实现ConstraintValidator{
私人最终实体管理人实体管理人;
私有类实体类;
私有字符串实体字段;
公共唯一验证程序(EntityManager EntityManager){
this.entityManager=entityManager;
}
公共无效初始化(唯一约束){
entityClass=constraint.entityClass();
entityField=约束。entityField();
}
公共布尔值有效(对象值、ConstraintValidatorContext上下文){
return!ExistsValidation.exists(entityManager、entityClass、entityField、value);
}
}
它工作得很好,但是当我在测试上下文中到达端点时,EntityManager未被注入并引发异常:
,原因是:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的“javax.persistence.EntityManager”类型的合格bean:至少需要1个符合autowire候选条件的bean。依赖项批注:{}

这就是我要做的测试:

@WebMvcTest(ProposalController.class)
类命题控制测试{
@自动连线
私有MockMvc-MockMvc;
@自动连线
私有对象映射器对象映射器;
@蚕豆
私有提议存储库提议存储库;
@试验
public void TestCreateProposition()引发异常{
//给定
var请求=新的ProposalRequest(
“塔尼亚”,
“Bárbara Mendes”,
"159.296.683-70",
"taniabarbaramendes@yazigi.com",
本地日期(2000年12月9日);
ArgumentCaptor captor=ArgumentCaptor.forClass(Proposal.class);
//什么时候
MockHttpServletResponse=mockMvc.perform(
post(“/proposions”).contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(请求)))
.andReturn().getResponse();
//然后
验证(proposalRepository,times(1)).save(captor.capture());
assertThat(captor.getValue()).isEqualToComparingFieldByField(request.toProposal());
assertThat(response.getStatus()).isEqualTo(CREATED.value());
}
}

在执行上述测试场景时,如何将EntityManager注入到定制bean验证器中?

有多种方法可以提供
EntityManager
。但是我假设在这个测试中,你想要模拟它来控制它的行为

要使其工作,只需添加

@MockBean
private EntityManager entityManager;
。。。您将在切片的Spring上下文中得到一个模拟版的
EntityManager

对于真正的
EntityManager
,您必须为测试提供一个数据库。您可以使用内存中的数据库,也可以使用Docker启动数据库

然后,您可以在同一测试中组合
@WebMvcTest
@DataJpaTest
,并获得一个包含所有JPA和MVC相关组件的切片Spring上下文