请问如何编写适用于具有不同实现的接口的junit5测试?
例如,我有一个名为Solution
的接口,有不同的实现,如SolutionI
,SolutionII
,我能否编写一个测试类来测试这两个实现吗?
有一篇帖子提供了一个示例,但如果有多个需要被调用的测试方法,我必须为每个测试方法传递参数。
请问是否有一种像JUnit4中使用的那样优雅的方式?
在JUnit4中,我有一个非常优雅的代码示例如下:
@RunWith(Parameterized.class)
public class SolutionTest {
private Solution solution;
public SolutionTest(Solution solution) {
this.solution = solution;
}
@Parameterized.Parameters
public static Collection<Object[]> getParameters() {
return Arrays.asList(new Object[][]{
{new SolutionI()},
{new SolutionII()}
});
}
// normal test methods
@Test
public void testMethod1() {
}
}
Junit 5声称ExtendWith()
类似,我尝试了以下代码
@ExtendWith(SolutionTest.SolutionProvider.class)
public class SolutionTest {
private Solution solution;
public SolutionTest(Solution solution) {
System.out.println("Call constructor");
this.solution = solution;
}
@Test
public void testOnlineCase1() {
assertEquals(19, solution.testMethod(10));
}
@Test
public void testOnlineCase2() {
assertEquals(118, solution.testMethod(100));
}
static class SolutionProvider implements ParameterResolver {
private final Solution[] solutions = {
new SolutionI(),
new SolutionII()
};
private static int i = 0;
@Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return parameterContext.getParameter().getType() == Solution.class;
}
@Override
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
System.out.println(i);
return solutions[i++];
}
}
}
不幸的是,testMethod1
使用了 SolutionI
,而 testMethod2
使用了 SolutionII
,这很合理,我不知道这是否有助于启发一点点。
提前感谢您的帮助。