我最近进入了使用jMock进行模拟的世界 - 特别是关于db的模拟。我已经阅读了一些关于如何(轻松地)模拟类/方法中包含的本地对象的帖子。由于我从未真正做过任何正确的TDD /模拟,我总是定义诸如' ResulSet'之类的对象。在适当的方法中。因此,我的问题是,当我继续使用未来的DB类/方法时,我应该将ResultSet定义为一个字段,然后使用适当的Setter方法作为访问它进行测试的方法吗?
如果我应该,这是否仍然合理,因为我可能不会将此setter方法用于除测试之外的任何其他方法?
基本上,我是否用setter方法定义所有对象以帮助模拟?
我看到这篇文章:Mocking methods of local scope objects with Mockito,似乎表明我上面所说的是可以接受的。
我知道这似乎是一个基本问题,但我不想在早期形成坏习惯。
答案 0 :(得分:3)
您在帖子中提到的内容并不是一个好方法。我建议开始你的TDD冒险而不是嘲笑。从测试优先方法开始,您将最终得到设计,这不需要这种可怕的测试(例如部分模拟)。然后开始模拟,但记住:只模拟你拥有的东西(所以如果ResultSet是一个JDBC类,你绝对不应该模仿它)。
答案 1 :(得分:1)
你不应该在那个级别嘲笑。基本上,我们的想法是您拥有充当数据库和ORM操作外观的接口。
interface IFetchUsers {
UserList GetAll();
User GetById(int id);
}
interface ICalculateDebt {
float GetDebt(int accountId);
}
interface IPersistOrder {
void Save(Order order);
}
(原谅语法错误,自从我完成Java以来已经很长时间了。)
这些是通过构造函数注入到其他类中的,并且对mock, or even stub变得微不足道。
然后,对于实际的db代码,您只需实现这些接口。您甚至可以将所有实现放在一个类中。
就是这样。不需要花哨,但是如果你想进入更高级版本的这个外观设计模式(虽然我认为如果使用一个好的ORM它并不是真的必要)。