【发布时间】:2016-06-06 11:11:03
【问题描述】:
我正在尝试为服务编写测试。但我没有成功模拟 repository 依赖项。其他非存储库依赖项已成功模拟。存储库实例始终是实际实现,而不是模拟实例。
我正在使用 Spring Boot 和 Spring Data JPA 来构建应用程序。 Mockito 用于模拟。我设法将问题提炼到一个测试项目中。完整的测试项目位于GitHub。以下是来自测试项目的代码的 sn-ps;以下是PersonServiceTest 类。
更新 1: before() 代码应该检查 personRepository 而不是 personService
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(App.class)
@WebAppConfiguration
@TestExecutionListeners({ServletTestExecutionListener.class, DirtiesContextBeforeModesTestExecutionListener.class, DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class, SqlScriptsTestExecutionListener.class})
@Transactional
@ActiveProfiles({"mock-some-bean", "mock-person-repository"})
public class PersonServiceTest {
@Inject
private SomeBean someBean;
@Inject
private PersonRepository personRepository;
@Inject
private PersonService personService;
@Before
public void before() {
assertThat(mockingDetails(someBean).isMock(), is(true));
assertThat(mockingDetails(personRepository).isMock(), is(true));
}
@Test
public void doSomething() throws Exception { ... }
}
测试类使用两个配置文件:mock-some-bean 和 mock-person-repository。基本上,我使用配置文件来确定应该模拟什么。在进行任何测试之前,我断言 someBean 和 personService 是模拟实例。 someBean 被正确模拟,但 personService 总是失败。以下代码是来自TestConfig 类的代码。
@Configuration
public class TestConfig {
private static final Logger logger = LoggerFactory.getLogger(TestConfig.class);
@Bean
@Profile("mock-some-bean")
public SomeBean someBean() {
logger.info("Mocking: {}", SomeBean.class);
return mock(SomeBean.class);
}
@Bean
@Profile("mock-person-repository")
public PersonRepository personRepository() {
logger.info("Mocking: {}", PersonRepository.class);
return mock(PersonRepository.class);
}
}
更新 2: 问题更清晰
我错过了什么? Spring Data JPA 似乎总是创建一个实例并忽略TestConfig 类中定义的@Bean。我如何“告诉” Spring Data JPA 不要创建实例?感谢您为解决此问题而提供的任何帮助。
更新 3:仍在寻找理想的解决方案
我仍然希望有一个解决方案。尽管我已将解决方案标记为已接受,但建议的解决方案并不理想。因为有不同级别的集成测试(从端到端测试到具有一小组依赖项的非常狭窄的测试范围)。
【问题讨论】:
-
注入 spring-jpa bean 后,监视该对象而不是模拟。
标签: spring-boot mockito spring-data-jpa