有没有办法知道 @MethodSource 内部为哪种测试方法提供数据?
Is there a way to know inside a @MethodSource for which test method it's providing data?
在我的 TestClass
中,我有很多不同的测试方法,它们都必须 运行 使用相同的数据,因此具有相同的 @MethodSource
:
public class TestClass {
private class TestData { /* some fields */ }
private List<TestData> testDataTemplates = asList(
new TestData(...),
/* some more elements */
);
static private Stream<Arguments> testDataProvider {
List<TestData> testData = new ArrayList<>();
// Here we do some nested .forEach iterating over the testDataTemplates
return testData.stream();
}
@ParametrizedTest
@MethodSource("testDataProvider")
public void testMethod1(...) { }
// some more test methods
@ParametrizedTest
@MethodSource("testDataProvider")
public void testMethodN(...) { }
}
对于testMethodN
,有必要使数据与其他方法略有不同。我的想法是检测内部 testDataProvider
当前正在为哪种方法生成数据并相应地调整输出。
有办法吗?
如果不是,那么实现我需要的最干净的方法是什么,再次强调 testDataProvider
对 testMethodN
的输出与其他测试方法的输出真的非常相似?
可以使用新的 @MethodSource
:
来解决这个问题
static private Stream<Arguments> filteredTestDataProvider() {
List<Arguments> testCases = new ArrayList<>();
testDataProvider().forEach(args -> {
// decide whether and how the current args are used
});
return testCases.stream();
}
当然,testMethodN
的 @MethodSource("filteredTestDataProvider")
也应该相应地进行调整。
在我的 TestClass
中,我有很多不同的测试方法,它们都必须 运行 使用相同的数据,因此具有相同的 @MethodSource
:
public class TestClass {
private class TestData { /* some fields */ }
private List<TestData> testDataTemplates = asList(
new TestData(...),
/* some more elements */
);
static private Stream<Arguments> testDataProvider {
List<TestData> testData = new ArrayList<>();
// Here we do some nested .forEach iterating over the testDataTemplates
return testData.stream();
}
@ParametrizedTest
@MethodSource("testDataProvider")
public void testMethod1(...) { }
// some more test methods
@ParametrizedTest
@MethodSource("testDataProvider")
public void testMethodN(...) { }
}
对于testMethodN
,有必要使数据与其他方法略有不同。我的想法是检测内部 testDataProvider
当前正在为哪种方法生成数据并相应地调整输出。
有办法吗?
如果不是,那么实现我需要的最干净的方法是什么,再次强调 testDataProvider
对 testMethodN
的输出与其他测试方法的输出真的非常相似?
可以使用新的 @MethodSource
:
static private Stream<Arguments> filteredTestDataProvider() {
List<Arguments> testCases = new ArrayList<>();
testDataProvider().forEach(args -> {
// decide whether and how the current args are used
});
return testCases.stream();
}
当然,testMethodN
的 @MethodSource("filteredTestDataProvider")
也应该相应地进行调整。