Play 2.4 中的 Guice、DI 和单元测试
所以我一直试图通过文档自己解决这个问题,但我没有取得任何进展。
我在创建存储库对象的服务类中设置了一些简单的 DI 绑定。简单。但是,当我在测试模式下运行此程序时,@Inject不执行任何操作,并且永远不会实例化存储库对象。
@Inject
TagRepository tagRepository;
因此,在使用它的线路上,在测试模式下,我们当然会得到一个NullPointerException。
tagRepository.tagExistsByName(tag);
这在我的测试中冒泡,如下所示:
[error] Test services.TagsServiceTest.testAddNewTag failed: java.lang.NullPointerException: null, took 0.097 sec
[error] at services.TagService.tagExists(TagService.java:27)
[error] at services.TagService.addNewTag(TagService.java:18)
[error] at services.TagsServiceTest.testAddNewTag(TagsServiceTest.java:29)
我的问题是,如何配置我的应用程序以在测试模式下使用 Guice 注入器?我的控制器没有这个问题,因为实际上正在向它们发出请求,设置完整的应用程序。
我应该提到的一件事是,我正在使用提供商将我的应用程序提供给测试。我应该使用 Guice 应用程序构建器吗?如果是这样,那将何去何从?游戏文档在这方面并不是很有帮助。这是提供商
@Override
protected FakeApplication provideFakeApplication() {
return new FakeApplication(new java.io.File("."), Helpers.class.getClassLoader(), ImmutableMap.of("play.http.router", "router.Routes"), new ArrayList<String>(), null);
}
更新:
这是基于以下建议的更新
在我的基本测试类中
@Override
protected Application provideApplication() {
return new GuiceApplicationBuilder().in(Mode.TEST).build();
}
然后在服务测试类中
@Before
public void beforeTest() {
Injector injector = new GuiceInjectorBuilder().bindings(bind(TagService.class).toInstance(new TagService())).injector();
tagService = injector.instanceOf(TagService.class);
}
但是,我仍然收到空指针异常,因为没有注入TagRepository。
答:
我想到的有点不对劲。如果您使用需要注入的对象设置注入器,然后从中创建一个实例,则不会再获得任何 NullPointerExceptions
@Before
public void beforeTest() {
Injector injector = new GuiceInjectorBuilder().bindings(bind(TagRepository.class).toInstance(new TagRepository())).injector();
tagService = injector.instanceOf(TagService.class);
}