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