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

How to mock java methods of superclass using powermock or any mock tool?

超级class

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

实施

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

我需要测试 getMyData() 方法并且我想要 mock/suppress createQuery() 方法因为它在测试环境中会失败。

谢谢!

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

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

不要这样做测试。这称为部分模拟,这是错误的,这意味着已编写的代码没有使用良好的 Object Oriented 设计。应该赞成 Composition OVER Inheritance.

尽管如此,DAO 是代表您系统边界的对象,即

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

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

  • 在数据库、实际实例或内存实例中插入数据(h2, hsqldb,...)
  • 准备好你的数据,这里有很多可能性(DbUnit, DbSetup,...)
  • 配置并运行您的 DAO 测试此数据库

运行 可能需要更多的设置和更多的时间,但在较长的 运行 中更好。

  • 更强大的映射测试
  • 更容易更改技术实现,无需更改测试
  • 运行 针对数据库,您可以更快地检测配置 issues/challenges,并确保它们在 3 年后不会损坏

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

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