如何在单元测试中模拟返回数据

时间:2016-01-21 22:17:55

标签: java unit-testing

我有以下代码

Class A {
    public boolean showData() {
        NewData data = getNewData();
        if (data!=null) {
            return true;
        } else {
            return false;
        }
    }

    public NewData getNewData () {
        return NewData = abc;
    }
}

当我调用showData()时,我需要模拟getNewData来返回模拟数据。

要清楚,

如果我像下面那样模拟getNewData,

when(a.getNewData()).thenReturn(null);
assertFalse(showData()) // this doesn't work because the mocked internal getNewdata is not used.

有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

假设你想测试A.showdata,你可以从A派生一个覆盖getNewData的类,它返回你需要测试的东西。这是一种被称为“子类和覆盖”的技术。

编辑:在伪代码中,您执行以下操作:

Class B: public A {
    public NewData getNewData () {
       return <whatever you need for your test>
    }
}

现在,要测试A.showData,请执行以下操作:

B mySut = new B();
Bool result = mySut.showData();  // this calls A.showData, which calls B.getNewData.

答案 1 :(得分:0)

最好的方法是将NewData作为参数

注入方法

showData(data)并使用调用showData的类/方法使用getNewData()

在模拟时,依赖注入是问题的一般答案(根据我的经验)。这允许您传入您希望方法使用的确切NewData,因此模拟。