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是否会支持这一点(我还没有尝试过)。单元测试通常被认为是相互隔离的,因此建议每次都创建一个新的模拟