spring-data - 如何拥有多个 Spring Boot Repository(Interface) 实例以进行完整的测试状态隔离?
问题描述
1) 情境化:
- 为了在我的测试类的所有测试中拥有完整的测试隔离状态;
- 我想为每个单独的测试创建一个新实例存储库(DAO);
- 我的存储库是一个接口,这就是为什么我不能简单地实例化它。
我的目标是:
以下是上述情况的代码:
1.1) 代码:
当前工作状态:正在工作,但使用 SAME-REPOSITORY-INSTANCE;
当前行为:
- 测试不稳定;
- 有时,它们会互相干扰;
- 意思是,提前完成的测试,销毁仍在使用的 Repository Bean,用于仍在运行的测试。
public class ServiceTests2 extends ConfigTests {
private List<Customer> customerList;
private Flux<Customer> customerFlux;
@Lazy
@Autowired
private ICustomerRepo repo;
private ICustomerService service;
@BeforeEach
public void setUp() {
service = new CustomerService(repo);
Customer customer1 = customerWithName().create();
Customer customer2 = customerWithName().create();
customerList = Arrays.asList(customer1,customer2);
customerFlux = service.saveAll(customerList);
}
@Test
@DisplayName("Save")
public void save() {
StepVerifier.create(customerFlux)
.expectNextSequence(customerList)
.verifyComplete();
}
@Test
@DisplayName("Find: Objects")
public void find_object() {
StepVerifier
.create(customerFlux)
.expectNext(customerList.get(0))
.expectNext(customerList.get(1))
.verifyComplete();
}
}
2)发生的错误:
3)问题:
- 如何创建存储库的多个实例
- 即使它是一个接口(不允许实例化)?
- 为了有一个完整的测试隔离
- 含义:每个测试中有一个不同的存储库实例?
- 为了有一个完整的测试隔离
- 即使它是一个接口(不允许实例化)?
非常感谢任何帮助或想法
解决方案
您可以在修改应用程序上下文的测试类上使用 @DirtiesContext 注释。
默认情况下,这将在整个测试类运行后将应用程序上下文标记为脏。如果您想在单个测试方法之后将上下文标记为脏,那么您可以对测试方法进行注释,或者在您的类级别注释中将 classMode 属性设置为 AFTER_EACH_TEST_METHOD。
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
当应用程序上下文被标记为脏时,它会从测试框架的缓存中删除并关闭;因此,对于需要具有相同资源位置集的上下文的任何后续测试,都会重建底层 Spring 容器。