Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么字段变量在JUnitParams方法中设置后为空?_Java_Junit_Mockito_Junitparams - Fatal编程技术网

Java 为什么字段变量在JUnitParams方法中设置后为空?

Java 为什么字段变量在JUnitParams方法中设置后为空?,java,junit,mockito,junitparams,Java,Junit,Mockito,Junitparams,我正在使用junitpams和Mockito编写一个测试类。我想使用Mockito mock作为参数。在我的测试中,我有大约十个模拟,我只想通过一个模拟来定义它的特殊行为 我用一个简单的例子再现了这个问题 我的问题是:我在方法参数fortest中初始化变量myList,但是当我调试到测试中时方法myList为空,但是param是我想要的模拟 @RunWith(JUnitParamsRunner.class) public class MockitoJUnitParamsTest { p

我正在使用
junitpams
Mockito
编写一个测试类。我想使用
Mockito mock
作为
参数
。在我的测试中,我有大约十个模拟,我只想通过一个模拟来定义它的特殊行为

我用一个简单的例子再现了这个问题

我的问题是:我在方法
参数fortest
中初始化变量
myList
,但是当我调试到
测试中时
方法
myList
为空,但是
param
是我想要的模拟

@RunWith(JUnitParamsRunner.class)
public class MockitoJUnitParamsTest {

    private List myList;

    @Test
    @Parameters
    public void test(List param) {
        assertThat(param).isEqualTo(this.myList);
    }

    public Object[] parametersForTest() {
        myList = Mockito.mock(List.class);
        return new Object[]{myList};
    }
}
我用

  • JUnitParams版本1.0.5
  • JUnit版本4.12
  • Mockito版本1.10.19

为什么myList为null以及如何修复它?

运行parametersForTest()方法的MockitoJUnitParamsTest类的实例与运行test()的实例不同。这是因为Junit将为每个测试方法创建不同的实例。 在您的情况下,将myList设置为静态

private static List myList;

可以部分解决问题,但如果测试并行运行,则可能会失败

运行parametersForTest()方法的MockitoJUnitParamsTest类的实例与运行测试()不同。这是因为Junit将为每个测试方法创建不同的实例。 在您的情况下,将myList设置为静态

private static List myList;

可以部分解决问题,但如果测试并行运行,则可能会失败

JUnit框架和运行程序通常为每个方法调用创建单独的测试类实例。看起来这就是JUnitParams所做的-您可以通过以下测试看到:

@RunWith(JUnitParamsRunner.class)
公共类junitpamstest{
@试验
@参数
公共无效测试(JUnitParamsTest参数){
Assert.assertNotNull(param);
Assert.assertNotSame(this,param);
}
对象[]参数fortest(){
返回新对象[]{this};
}
}
因此,上面示例的问题是,由
参数forest设置的
myList
字段是与调用
测试(列表)
的对象不同的对象的成员

如何修复 好吧,我想关键问题是,你想在这里实现什么?JUnitParams的全部要点是将参数注入到测试方法中,因此您不必使用字段。在我看来,修改
parameters sfortest()
方法中的字段值超出了预期用途,我真的不明白为什么要这样做

一个快速而肮脏的修复方法是将
myList
设置为静态,只要您的测试类没有被多个线程同时访问(某些单元测试环境确实运行多线程,因此存在风险),该方法就可以工作


更好的解决方案是重新设计测试,这样就不会从参数生成方法内部修改字段。您给出的示例似乎只测试JUnitParams本身,所以我无法帮助您确定好的设计是什么,因为我不知道您想要实现什么。你是说你想要几个测试方法共享一个Mockito mock吗?若然,原因为何?我不确定Mockito是否会支持这一点(我还没有尝试过)。单元测试通常被认为是相互隔离的,因此建议每次都创建一个新的mock。

JUnit框架和运行程序通常为每个方法调用创建单独的测试类实例。看起来这就是JUnitParams所做的-您可以通过以下测试看到:

@RunWith(JUnitParamsRunner.class)
公共类junitpamstest{
@试验
@参数
公共无效测试(JUnitParamsTest参数){
Assert.assertNotNull(param);
Assert.assertNotSame(this,param);
}
对象[]参数fortest(){
返回新对象[]{this};
}
}
因此,上面示例的问题是,由
参数forest设置的
myList
字段是与调用
测试(列表)
的对象不同的对象的成员

如何修复 好吧,我想关键问题是,你想在这里实现什么?JUnitParams的全部要点是将参数注入到测试方法中,因此您不必使用字段。在我看来,修改
parameters sfortest()
方法中的字段值超出了预期用途,我真的不明白为什么要这样做

一个快速而肮脏的修复方法是将
myList
设置为静态,只要您的测试类没有被多个线程同时访问(某些单元测试环境确实运行多线程,因此存在风险),该方法就可以工作

更好的解决方案是重新设计测试,这样就不会从参数生成方法内部修改字段。您给出的示例似乎只测试JUnitParams本身,所以我无法帮助您确定好的设计是什么,因为我不知道您想要实现什么。你是说你想要几个测试方法共享一个Mockito mock吗?若然,原因为何?我不确定Mockito是否会支持这一点(我还没有尝试过)。单元测试通常被认为是相互隔离的,因此建议每次都创建一个新的模拟