【发布时间】:2011-09-18 16:36:18
【问题描述】:
先决条件:我使用的是最新版本的 Play! framework 和 Java 版本(不是 Scala)。
我需要在创建用户时将消息发布到消息队列,并且我想测试该行为。我的问题是使它易于测试。
控制器方法
在其他框架中,我会做的是在控制器中使用构造函数注入并在我的测试中传入一个模拟队列;但是,使用 Play!控制器是静态的,这意味着我不能在测试中执行new MyController(mockedQueue)。
我可以使用 Google Guice 并在我的控制器中的静态字段上添加 @Inject 注释,但这对我来说感觉不太好,因为这要么意味着我必须公开该字段才能在测试,或者我必须在测试中使用容器。我更喜欢使用构造函数注入,但是 Play!似乎没有帮助。
模型方法
人们常说您的逻辑应该在您的模型中,而不是在您的控制器中。这就说得通了;但是,我们不是在 Ruby 中,让您的实体与外部服务(电子邮件、消息队列等)交互的可测试性比在动态环境中要少得多,在动态环境中,您可以用模拟的方式替换 MessageQueue 静态调用随意实例。
如果我让我的实体调用队列,那如何测试?
当然,如果我进行端到端集成测试,这两种情况都是不必要的,但我宁愿不需要消息队列或 SMTP 服务器来启动我的测试。
所以我的问题是:如何为我的 Play 建模!控制器和/或模型来促进测试与外部服务的交互?
【问题讨论】:
标签: java unit-testing testing playframework