1

超级班

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()方法,因为它会在测试环境中失败。

谢谢!

4

2 回答 2

1

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

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

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

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

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

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

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

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

MyDAO daoSpy = Mockito.spy(new MyDAO());
doReturn(new Object()).when(daoSpy).createQuery();
于 2015-07-18T09:45:43.767 回答
0

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

@Test
public void testGetMyData() {
        MyDAO dao = new MyDAO();
        MyDAO daoSpy = Mockito.spy(dao);
        Mockito.when(daoSpy.createQuery()).thenReturn(new Object());
    }
于 2015-07-18T03:07:22.117 回答