使用Mockito和JUnit进行测试时出现奇怪的行为

时间:2016-06-22 14:18:50

标签: java unit-testing junit mocking mockito

这里我正在使用签名测试来自TestedClass的方法:

  

public static boolean 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

1 个答案:

答案 0 :(得分:2)

使用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));
}

等等。