java – 验证是否从被测试的方法调用了继承的超类方法

好的,我再次被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();
    }
}
上一篇:Java编写unittest用于在用户键入控制台时退出程序


下一篇:java – Mockito – Mock相同类型的通用对象