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

Java 通过使用JUnit@Rule使用Mockito进行参数化测试?,java,junit,mockito,rule,parameterized-tests,Java,Junit,Mockito,Rule,Parameterized Tests,接下来是:我被要求开始一个新的问题 问题是我对JUnit规则,或者对运行程序等的了解还不够,无法像Jeff Bowman提到的那样解决这个问题。在你以后的评论中,我指出了差距:你需要使用Mockito作为规则,并将其参数化为运行程序,而不是相反 原因是运行程序负责报告测试的数量,而Parameterized根据测试方法的数量和参数化输入的数量来操纵测试的数量,因此Parameterized成为运行程序流程的一部分非常重要。相比之下,Mockito运行程序或规则的使用只是封装初始化Mockito注

接下来是:我被要求开始一个新的问题


问题是我对JUnit
规则
,或者对
运行程序
等的了解还不够,无法像Jeff Bowman提到的那样解决这个问题。

在你以后的评论中,我指出了差距:你需要使用Mockito作为规则,并将其参数化为运行程序,而不是相反

原因是运行程序负责报告测试的数量,而Parameterized根据测试方法的数量和参数化输入的数量来操纵测试的数量,因此Parameterized成为运行程序流程的一部分非常重要。相比之下,Mockito运行程序或规则的使用只是封装初始化Mockito注释和验证Mockito用法的
@Before
@After
方法,作为一个与其他
@Rule
实例相邻的
@Rule
规则,可以非常容易地完成这一点,MockitoJUnitRunner就是这样

要直接从文档页和文档页进行抄录,请执行以下操作:

@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));
    }
}
@RunWith(参数化的.class)
公共类组件测试{
@Rule public MockitoRule Rule=MockitoJUnit.Rule();
@嘲弄你的朋友嘲弄你的朋友;
@参数
公共静态收集数据(){
返回Arrays.asList(新对象[][]{
{ 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }  
});
}
私有int fInput;
预期的私有整数;
公共组件测试(int输入,应为int){
fInput=输入;
预期=预期;
}
@试验
公开无效测试(){
//正如你可能猜到的,这不是Mockito使用的一个非常现实的例子。
当(mockYourDep.calculate(fInput)),然后返回(feexpected);
YourComponent YourComponent=新建YourComponent(mockYourDep);
assertEquals(feexpected,yourComponent.compute(fInput));
}
}

你看过教程了吗?它还有一个用于参数化的部分tests@TimothyTruckle我的问题是,我想使用Mockito,如果您想(特别是)注入mock,它会使用自己的RunWith注释。这就是问题所在。我有理由相信杰夫·鲍曼能回答这个问题。但是他想让我开始一个新问题…@MikCorvent教程将回答你关于mockito的所有问题。问题是:你想学点什么,还是想复制一个解决方案?@TimothyTruckle我访问了你建议的页面,搜索了Mockito。。。有一个链接指向“Mockito简介”。但我找不到任何建议如何进行参数化测试的地方。实际上,根据我的经验,复制的解决方案是开始学习sthg的一个很好的方法。如果你能给我举个例子,如果你能回答这个问题,我将非常感激。你现在变得很烦人。不能将两个
RunWith
批注组合在一起。因此,无法将
RunWith(MockitoJUnitRunner.class)
RunWith(Parameterized.class)
组合。你需要考虑这一点,而不是假设人们比你年轻或更愚蠢。有可能也嘲笑这些数据吗?i、 e
@Mock private int fInput
?@Atieh当然;我在上面已经这样做了。参数化控制测试的运行次数和测试类的实例化方式,然后MockitoRule控制每个测试用例(即每个测试类实例)中
@Mock
参数的填充方式。只要参数化的运行程序位于
@RunWith
注释中,并且Mockito初始化以某种方式发生,这两种方法就可以很好地协同工作。