通过使用JUnit@Rule使用Mockito进行参数化测试?

2022-09-03 10:12:01

这是从这个问题开始的:我被要求开始一个新问题。

问题是,我只是对JUnit的了解还不够,或者这里发生了什么等等,无法以Jeff Bowman提到的方式解决问题。RuleRunners


答案 1

在你后来的评论中,我找出了差距:你需要使用Mockito作为规则,并将参数化为跑步者,而不是相反。

原因是运行器负责报告测试数量,而参数化根据测试方法的数量和参数化输入的数量来操作测试的数量,因此参数化成为运行器过程的一部分非常重要。相比之下,使用Mockito运行器或规则只是为了封装初始化Mockito注释并验证Mockito用法的方法,这可以作为与其他实例相邻工作的方法非常容易地完成 - 以至于MockitoJUnitRunner几乎被弃用@Before@After@Rule@Rule

要直接从 JUnit4 参数化测试文档页面和 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));
    }
}

答案 2

推荐