在这里我正在测试带有签名的测试频道的方法:
公共静态布尔getboolean(Classa classa);
这是我的模拟对象配置。
@Mock
private ClassA mockedCLass; //I try to mock ClassA behaviour
.....
when(mockedClass.getValues()).thenReturn(null,emptyList,oneElementList,defaultList);
getBoolean()
方法使用模拟对象。不幸的是,当我使用这种方法时,模拟似乎完全错误。
boolean res1 = TestedClass.getBoolean(mockedClass);
boolean res2 = TestedClass.getBoolean(mockedClass);
boolean res3 = TestedClass.getBoolean(mockedClass);
boolean res4 = TestedClass.getBoolean(mockedClass);
但是,当我这样拆分时:
when(mockedClass.getValues()).thenReturn(null);
boolean res1 = TestedClass.getBoolean(mockedClass);
when(mockedClass.getValues()).thenReturn(emptyList);
boolean res2 = TestedClass.getBoolean(mockedClass);
等等,一切都很好。这里发生了什么?我会感谢任何帮助。
编辑://测试用例
List<String> emptyList = Collections.<String>emptyList();
List<String> defaultList = Arrays.asList("one", "two", "three");
List<String> oneElementList = Arrays.asList("one");
这是TestedClass.
public static boolean getBoolean(ClassA classA){
return classA.getValues() == null || classA.getValues().size() <= 1; }
当我调用第一次方法的测试用例时,我会得到:
1)null,defaultList,oneElementList -> true,true,true instead of true,false,true
2)oneElementList,null,defaultList -> error, Null pointer exception
3)null,oneElementList,defaultList,emptyList -> true,false,true,true instead of true,true,false,true
4)null or defaultList or oneElementList or emptyList -> works fine for one case
在您的getBoolean
方法
public static boolean getBoolean(ClassA classA) {
return classA.getValues() == null || classA.getValues().size() <= 1;
}
您两次调用固态方法。每个呼叫都从提供给thenReturn
的值的值中,直到最后一个值重复。
您可能需要一次提取getValues
的结果并重复使用。
public static boolean getBoolean(ClassA classA) {
List<String> values = classA.getValues();
return values == null || values.size() <= 1;
}
正如罗格里奥(Rogério)在评论中所建议的那样,最好将您的测试限制为不同的情况,即更好的做法。一个每个输入值。这类似于您的第二种方法中发生的情况。每个测试都会生成自己的存根,以调用getValues
,这不会干扰其他测试。
您将有一个用于null
参数的测试,一个用于空列表,一个用于一个元素的列表,一个具有一个以上的元素。例如
@Test
public void nullArgument() {
when(mockedClass.getValues()).thenReturn(null);
Assert.assertTrue(TestedClass.getBoolean(mockedClass));
}
@Test
public void emptyListArgument() {
List<String> emptyList = Collections.<String>emptyList();
when(mockedClass.getValues()).thenReturn(emptyList);
Assert.assertTrue(TestedClass.getBoolean(mockedClass));
}
等等。