如何使用powermock或任何模拟工具模拟超类的java方法?

时间:2015-07-18 02:53:02

标签: java unit-testing mockito powermock powermockito

超级

public class BasicDao {
    public Object createQuery() {
        return new Object();
    }
}

实施

public class MyDAO implements BasicDao {
    public Object getMyData() {
        Object obj = createQuery();
        // more code...
        return ...;
    }
}

我需要测试getMyData()方法,我想模​​拟/禁止createQuery()方法,因为它会在测试环境中失败。

谢谢!

2 个答案:

答案 0 :(得分:1)

不要这样做测试。这称为部分模拟,这是错误的,这意味着已经编写的代码没有使用良好的面向对象的设计。一个人应该赞成Composition OVER Inheritance

然而,DAO是代表系统边界的对象,即

  • 一方是面向对象
  • 一方是关系

在这种情况下,您应该编写集成测试,

  • 在数据库,实际实例或内存实例中插入数据(h2hsqldb,...)
  • 准备您的数据,这里有很多可能性(DbUnitDbSetup,...)
  • 在此数据库上配置并运行DAO测试

可能需要更多的设置和更多的时间来运行,但从长远来看它会更好。

  • 更强大的映射测试
  • 更容易更改技术实施,而无需更改测试
  • 针对数据库运行,您可以更快地检测配置问题/挑战,并确保它们在3年后不会中断

@ user3386493的回答在技术上是正确的,但我建议使用这种与间谍的存根(否则执行实际的方法代码):

MyDAO daoSpy = Mockito.spy(new MyDAO());
doReturn(new Object()).when(daoSpy).createQuery();

答案 1 :(得分:0)

你可以使用Mockito来做到这一点。

@Test
public void testGetMyData() {
        MyDAO dao = new MyDAO();
        MyDAO daoSpy = Mockito.spy(dao);
        Mockito.when(daoSpy.createQuery()).thenReturn(new Object());
    }