JUnit5有如下特性 @BeforeEach
, @BeforeAll
, @AfterAll
, @AfterEach
允许您在测试生命周期事件期间执行代码的注解,例如清除测试之间共享的状态。
我想为某些测试配置提供一种自动执行此操作的方法,而不必记住在每个测试中放置这些生命周期挂钩。
例如:
如果我有一个加载一些存根数据源的spring测试配置:
interface DataProvider {
String getData(String id);
}
以及一个依赖于此的类:
@Component
class ClassThatDependsOnDataProvider {
private final DataProvider dataProvider;
@Autowired
ClassThatDependsOnDataProvider(DataProvider dataProvider) {
this.dataProvider = dataProvider;
}
public String process(String id) {
String data = dataProvider.get(id);
return some_processing_of(data);
}
}
通常这可能会影响后端,但对于我的测试,我将使用内存中的解决方案来交换它:
@TestComponent
class InMemoryDataProvider implements DataProvider {
private Map<String, String> data = new HashMap<>();
public void setData(String id, String data) {
data.put(id, data);
}
public String getData(String id) {
return data.get(id);
}
public void clear() {
data.clear();
}
}
在我的测试中,我可能想用它在我的后端删除数据,比如:
@SpringBootTest
@Import({InMemoryDataProvider.class})
class ClassThatDependsOnDataProviderTests {
@Autowired InMemoryDataProvider dataProvider;
@Autowired ClassThatDependsOnDataProvider classThatDependsOnDataProvider;
@Test
public void should_correctly_process_data() {
// given i have an id with a value
dataProvider.setData("stub_id", "stub_value");
// when i process my id
var result = classThatDependsOnDataProvider.process("stub_id");
// then i receive expected result
assertThat(result).isWhatIExpect();
}
// more @Tests
// DON'T WANT TO HAVE TO DO THIS IN EACH TEST CLASS
@AfterEach
public void tearDown() {
dataProvider.clear();
}
}
我希望能够移除 tearDown()
方法,并用 @AfterEach
,并将该行为移动到测试组件/test-fake或配置类中,这样,使用一组这样的提供程序,就可以很容易地维护一组测试,这些测试将替换为假版本,而不必手动管理每个测试的生命周期。
是否有某种spring特性、生命周期事件或junit5特性允许这样做?
请原谅这个简单的例子,显然这是一个简单的测试,但它只是一个讨论的参考。假设 @MockBean
或者使用mocking libs不是一个选项。
1条答案
按热度按时间7uzetpgm1#
您可以使用junit5扩展:https://junit.org/junit5/docs/current/user-guide/#extensions.
例如,您的扩展可能如下所示:
请注意:
SpringExtension.getApplicationContext(context);
获取spring应用程序上下文,以便可以检索上下文中定义的bean扩展实现aftereachcallback接口,但存在其他扩展点的其他扩展(即beforeachcallback、beforeallcallback等)
要在测试中激活扩展,请执行以下操作: