所以我一直試圖通過文檔自己弄清楚這一點,但我沒有得到任何地方。Guice,DI和單元測試在玩2.4
我已經在創建存儲庫對象的服務類中設置了一些簡單的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);
}
UPDATE:
這是基於以下
建議裏面我BaseTest類
@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沒有被注入。
回答:
我在想這個有點不對。如果你安裝你需要注入目標的噴射器,然後創建從一個實例,如果你伸出你WithApplication
不會得到任何更多NullPointerExceptions的
@Before
public void beforeTest() {
Injector injector = new GuiceInjectorBuilder().bindings(bind(TagRepository.class).toInstance(new TagRepository())).injector();
tagService = injector.instanceOf(TagService.class);
}
我認爲你忘了創建'@ Injected'版本庫的模擬,這就是爲什麼你會得到異常。 –
創建該模擬的正確方法是什麼?應用程序構建器?如果是這樣,那去哪裏? – Zarathuztra
如果你正在使用構造函數或參數注入,它會相當容易,但從你提供的東西我猜你沒有使用任何一個,所以看看這個線程http://stackoverflow.com/questions/2448013/ how-test-guice -injection –