Tak więc próbowałem to sobie samemu zilustrować poprzez dokumentację, ale nigdzie się nie dostaję.Testy Guice, DI i Unit w grze 2.4
Mam kilka prostych konfiguracji wiązań DI w klasie usług, która tworzy obiekt repozytorium. Prosty. Jednak gdy uruchomię to w trybie testowym, @Inject nic nie zrobi i obiekt repozytorium nigdy nie zostanie utworzony.
@Inject
TagRepository tagRepository;
Więc na linii, gdzie jest zastosowanie, w trybie testowym, my oczywiście uzyskać NullPointerException
tagRepository.tagExistsByName(tag);
pęcherzyki To się w moim teście tak:
[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)
moje pytanie jak skonfigurować swoją aplikację, aby używać wtryskiwaczy Guice w trybie testowym? Nie miałem tego problemu z moimi kontrolerami, ponieważ do nich właśnie wysyłano wnioski, konfigurując pełną aplikację.
Jedną z rzeczy, o których powinienem wspomnieć, jest to, że korzystam z usług dostawcy, aby udostępnić moją aplikację do testów. Czy powinienem używać kreatora aplikacji Guice? Jeśli tak, to gdzie to jest? Dokumenty do gry nie są zbyt pomocne w tym względzie. Tutaj jest dostawcą
@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:
Oto aktualizacja na podstawie sugestii poniżej
Wewnątrz mojej klasie BaseTest
@Override
protected Application provideApplication() {
return new GuiceApplicationBuilder().in(Mode.TEST).build();
}
A potem w klasie Testing Service
@Before
public void beforeTest() {
Injector injector = new GuiceInjectorBuilder().bindings(bind(TagService.class).toInstance(new TagService())).injector();
tagService = injector.instanceOf(TagService.class);
}
Jednak nadal otrzymuję wyjątki wskaźnika pustego, ponieważ TagRepository nie jest wstrzykiwany.
ODPOWIEDŹ:
Myślałam o tym nieco racji. Jeśli konfiguracja wtryskiwacz z obiektu trzeba wstrzykiwać, a następnie utworzyć instancję z tym, że nie będzie żadnych więcej NullPointerExceptions
@Before
public void beforeTest() {
Injector injector = new GuiceInjectorBuilder().bindings(bind(TagRepository.class).toInstance(new TagRepository())).injector();
tagService = injector.instanceOf(TagService.class);
}
Myślę, że zapomniałeś stworzyć makietę repozytorium '@ Injected' i dlatego otrzymujesz wyjątek. –
Jaki byłby właściwy sposób tworzenia tego makiety? Konstruktor aplikacji? Jeśli tak, to gdzie by to poszło? – Zarathuztra
Jeśli używasz konstruktora lub iniekcji parametru, byłoby to dość łatwe, ale z tego, co masz pod warunkiem Zgaduję, że nie używasz żadnego z nich, więc spójrz na ten wątek http://stackoverflow.com/questions/2448013/ how-test-guice-injections –