我有一个简单的测试设计问题,我想一劳永逸地解决。
我已经习惯了常规的Java设计模式,其中有一些Manager interface
(或外观)和一组DAO interfaces
。 ManagerImpl
的具体实现是使用DaoImpl
的具体实现。
现在我正处于实施阶段,我还没有将数据库连接到我的项目,所以我想这是一个没有DB编写正确单元测试的最佳时机: - )
我能够通过使用mockito来模拟我的经理的一些方法,但由于Test Under Method(或称为System Under Test)在内部使用DAO,我也必须模拟DAO。不幸的是,如果没有在我的经理中设置具体的DAO实现,我就不能这样做,比如myManager.setMyDao(mockedDao)
,但是现在我必须将这个setMyDao
方法拉到接口中,这当然会破坏封装并使我干净完美接口看起来像垃圾。
所以问题是:如何在保留干净Manager-Dao
架构的同时在测试中模拟DAO?
答案 0 :(得分:1)
您应该对具体实现进行单元测试,即ManagerImplTest
,这将明确创建ManagerImpl
,因此您可以使用所有setMyDao
方法进行模拟。您的测试不会了解Manager interface
。
答案 1 :(得分:1)
你可以完全摆脱set
方法并注入工厂。这样就不会暴露额外的方法(实际上,甚至不存在额外的方法)并且问题消失了。然后在测试中,您将工厂模拟配置为返回DAO模拟,并从该点开始简单明了。