1

我有一个简单的测试设计问题,我想一劳永逸地解决。

我非常习惯于常规的 Java 设计模式,其中有一些Manager interface(或外观)和一组DAO interfaces. 具体实现ManagerImpl是使用DaoImpl.

现在我正处于实施阶段,我的项目还没有连接数据库,所以我想这是在没有数据库的情况下编写正确单元测试的最佳时机:-)

我可以通过使用 mockito 来模拟我的经理的一些方法,但是由于 Test Under Method(或所谓的 System Under Test)在内部使用 DAO,我也必须模拟 DAO。不幸的是,如果不在我的管理器中设置具体的 DAO 实现,我就无法做到这一点,例如myManager.setMyDao(mockedDao),但现在我必须将此方法拉出setMyDao到接口中,这当然会破坏封装并使我干净完美的接口看起来像垃圾。

所以问题是:如何在测试中模拟 DAO,同时保持干净的Manager-Dao架构?

4

2 回答 2

1

您应该对具体实现进行单元测试,即ManagerImplTest,它将显式创建ManagerImpl,因此您拥有所有setMyDao可用于模拟的方法。你的测试不会知道Manager interface

顺便说一句,并不总是需要为所有内容创建接口。在大多数情况下,只存在管理器和 daos 的单一实现。如果没有任何其他强有力的理由(例如 Spring AOP 代理或依赖分离),我想为了简单起见,最好不要为所有内容创建接口。

于 2012-06-11T08:44:25.653 回答
1

您可以完全摆脱set方法并注入工厂。这样就不会暴露额外的方法(事实上,甚至不存在额外的方法)并且问题消失了。然后在测试中,您将工厂模拟配置为返回 DAO 模拟,从那时起,它就变得简单明了。

于 2012-06-11T09:00:28.917 回答