如何使用 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 是代表您系统边界的对象,即
- 一方面是面向对象
- 一侧是关系
在这种情况下你应该编写集成测试,
运行 可能需要更多的设置和更多的时间,但在较长的 运行 中更好。
- 更强大的映射测试
- 更容易更改技术实现,无需更改测试
- 运行 针对数据库,您可以更快地检测配置 issues/challenges,并确保它们在 3 年后不会损坏
@user3386493 的回答在技术上也是正确的,但我建议使用这种带有间谍的存根(否则会执行实际的方法代码):
MyDAO daoSpy = Mockito.spy(new MyDAO());
doReturn(new Object()).when(daoSpy).createQuery();
超级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 是代表您系统边界的对象,即
- 一方面是面向对象
- 一侧是关系
在这种情况下你应该编写集成测试,
运行 可能需要更多的设置和更多的时间,但在较长的 运行 中更好。
- 更强大的映射测试
- 更容易更改技术实现,无需更改测试
- 运行 针对数据库,您可以更快地检测配置 issues/challenges,并确保它们在 3 年后不会损坏
@user3386493 的回答在技术上也是正确的,但我建议使用这种带有间谍的存根(否则会执行实际的方法代码):
MyDAO daoSpy = Mockito.spy(new MyDAO());
doReturn(new Object()).when(daoSpy).createQuery();