使用 JUnit @Rule 使用 Mockito 进行参数化测试?
Parameterized testing with Mockito by using JUnit @Rule?
这是从 this question 开始的:我被要求开始一个新问题。
问题是我对 JUnit Rule
或 Runners
等等的了解不够,无法按照 Jeff 提到的方式解决问题鲍曼.
在您后来的评论中,我发现了差距:您需要将 Mockito 用作规则并将参数化用作运行器,而不是相反。
原因是 Runner 负责报告测试数量,而 Parameterized 根据测试方法的数量和参数化输入的数量来操纵测试数量,因此 Parameterized 成为一个非常重要的Runner 进程的一部分。相比之下,使用 Mockito 运行器或规则只是简单地封装初始化 Mockito 注释和验证 Mockito 使用的 @Before
和 @After
方法,这可以很容易地完成为 @Rule
与其他 @Rule
个实例相邻工作——以至于 MockitoJUnitRunner 是 very nearly deprecated.
直接从 JUnit4 Parameterized Test doc page and MockitoRule 文档页面抄袭:
@RunWith(Parameterized.class)
public class YourComponentTest {
@Rule public MockitoRule rule = MockitoJUnit.rule();
@Mock YourDep mockYourDep;
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{ 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }
});
}
private int fInput;
private int fExpected;
public YourComponentTest(int input, int expected) {
fInput = input;
fExpected = expected;
}
@Test
public void test() {
// As you may surmise, this is not a very realistic example of Mockito's use.
when(mockYourDep.calculate(fInput)).thenReturn(fExpected);
YourComponent yourComponent = new YourComponent(mockYourDep);
assertEquals(fExpected, yourComponent.compute(fInput));
}
}
这是从 this question 开始的:我被要求开始一个新问题。
问题是我对 JUnit Rule
或 Runners
等等的了解不够,无法按照 Jeff 提到的方式解决问题鲍曼.
在您后来的评论中,我发现了差距:您需要将 Mockito 用作规则并将参数化用作运行器,而不是相反。
原因是 Runner 负责报告测试数量,而 Parameterized 根据测试方法的数量和参数化输入的数量来操纵测试数量,因此 Parameterized 成为一个非常重要的Runner 进程的一部分。相比之下,使用 Mockito 运行器或规则只是简单地封装初始化 Mockito 注释和验证 Mockito 使用的 @Before
和 @After
方法,这可以很容易地完成为 @Rule
与其他 @Rule
个实例相邻工作——以至于 MockitoJUnitRunner 是 very nearly deprecated.
直接从 JUnit4 Parameterized Test doc page and MockitoRule 文档页面抄袭:
@RunWith(Parameterized.class)
public class YourComponentTest {
@Rule public MockitoRule rule = MockitoJUnit.rule();
@Mock YourDep mockYourDep;
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{ 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }
});
}
private int fInput;
private int fExpected;
public YourComponentTest(int input, int expected) {
fInput = input;
fExpected = expected;
}
@Test
public void test() {
// As you may surmise, this is not a very realistic example of Mockito's use.
when(mockYourDep.calculate(fInput)).thenReturn(fExpected);
YourComponent yourComponent = new YourComponent(mockYourDep);
assertEquals(fExpected, yourComponent.compute(fInput));
}
}