【发布时间】:2021-02-25 00:08:33
【问题描述】:
我有一个主要的@SpringBootApplication,它需要扫描特定的包以启用 JPA 存储库,所以我使用 @EnableJpaRepositories 来指定它。现在我正在实现单元测试并且我只想测试控制器组件,所以我按照官方文档中的教程使用@WebMvcTest(MyController.class) 来测试具有服务依赖关系的控制器。
问题是这对我不起作用,因为它正在尝试加载我在主 Spring Boot 应用程序中指定的 JpaRepositories(当我在主类中注释 @EnableJpaRepositories 时,测试运行没有问题)。
我猜我需要为测试类创建一个特定的配置,以便它可以忽略主要配置(因为我只想加载控制器并模拟服务层),但我不知道如何创建这样的。我尝试添加一个空配置,但仍然失败并出现同样的错误:
@TestConfiguration
static class TestConfig {}
这是我得到的错误:
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'failureTaskHandler': Unsatisfied dependency expressed through field 'myManager'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'msgManager': Unsatisfied dependency expressed through field 'inboundManager'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'inboundManager': Unsatisfied dependency expressed through field 'messageRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageRepository' defined in com.example.MessageRepository defined in @EnableJpaRepositories declared on MonitorApplication: Cannot create inner bean '(inner bean)#45e639ee' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#45e639ee': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
还有我的测试课:
@WebMvcTest(MyController.class)
public class MyControllerTest {
@Autowired private MockMvc mvc;
@MockBean private MyService service;
// Tests here
// @Test
// public void...
}
MyController 类:
@RestController
@CrossOrigin
@RequestMapping("/api")
@Slf4j
public class MyController {
@Autowired private MyService service;
@PostMapping(value = "/search", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody SearchResponse getOrders(@RequestBody SearchRequest orderSearchRequest) {
log.info("Receiving orders request...");
return service.getOrders(orderSearchRequest);
}
}
【问题讨论】:
-
能不能显示MyController的代码
-
好的,我会把它添加到原帖中
-
myManager 在哪里使用?
-
myManager 是我在主应用程序的其他部分使用的一些外部库的一部分,但我想忽略所有这些,因为我将模拟服务响应,因为我正在对控制器进行单元测试。 myManager 不被存储库或服务使用,只是我的应用程序的另一个功能。
标签: java spring-boot unit-testing spring-data spring-mvc-test