【发布时间】:2014-03-11 08:38:51
【问题描述】:
所以我们这里有这个方法,系统的其余部分可以根据输入调用底层方法。
public SomeReturnObj doSomethingWithInputs(List<Input> inputs) {
for(Input input : inputs) {
if(input.getName().equals("A") {
handleAInput(input);
}
else if(input.getName().equals("B") {
handleBInput(input);
}
else { ... }
}
// ...
}
为了获得良好的代码覆盖率,我想测试一下,如果我将两个 Inputs 名称为 A 和三个名称为 B 的列表放在一起,则相应的内部方法会被调用两次或三次,分别。
所以我尝试了以下方法:
@Test
public void separatingInputsByName() {
Input entry1 = mock(Input .class);
Input entry2 = mock(Input .class);
Input entry3 = mock(Input .class);
doReturn("A").when(entry1).getName();
doReturn("A").when(entry2).getName();
doReturn("B").when(entry3).getName();
ClassUnderTest sut = mock(ClassUnderTest .class);
sut.doSomethingWithInputs(Arrays.asList(entry1, entry2, entry3));
verify(sut).handleAInput(entry1);
verify(sut).handleAInput(entry2);
verify(sut).handleBInput(entry3);
}
很遗憾,这并没有导致正确调用内部方法,可能是因为被测类是模拟的,所以方法实现不同。
如何正确测试/验证这样的方法?
【问题讨论】:
标签: java unit-testing junit mocking mockito