好的,我再次被Mockito困住了.情况如下:
我有一个超类和一个子类:
class Parent {
protected void insertData() {
// Here is some database related stuff
someObject.storeData();
}
}
class Child extends Parent {
private String name;
public void printHierarchy(int x) {
if (x > 1) {
insertData()
} else {
System.out.println("Child");
}
}
}
在我的单元测试类中,我正在测试Child类的printHierarchy()方法:
@RunWith(SpringJUnit4ClassRunner.class)
public class ChildTest {
@InjectMocks // To inject mock objects
private Child child = new Child();
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
// This is where the issue is
doNothing().when(child).insertData();
}
@Test
public void testPrintHierarchy() {
child.printHierarchy(5);
// Here also
verify(child, times(1)).insertData();
}
}
所以问题是,如何验证是否从Child#printHierachy()调用了insertData()方法?
当我尝试上面的代码时,我得到的错误是:
Argument passed to when() is not a mock!
当然,孩子不是嘲笑.我正在测试那堂课.但是我该如何解决这个问题呢?
不,我没有发现任何重复.一个问题非常相似,但它对我没有帮助.
解决方法:
你需要使用spy().以下代码有效:
public final class Bin
{
@Test
public void spyMe()
{
final Child c = spy(new Child());
doNothing().when(c).printParent();
c.printHierarchy(1);
verify(c).printParent();
}
}
class Parent {
protected void printParent() { System.exit(0);}
}
class Child extends Parent {
private String name;
public void printHierarchy(int i) {
if (i > 0)
printParent();
}
}