Итак, я пытался понять это самостоятельно с помощью документации, но ничего не получаю.
У меня есть несколько простых настроек привязок 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);
}
ОБНОВИТЬ:
Вот обновление, основанное на предложении ниже
Внутри моего класса 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 не внедряется.
ОТВЕЧАТЬ:
Я немного неправильно подумал об этом. Если вы настроите инжектор с объектом, который вам нужно ввести, а затем создайте экземпляр из него, вы больше не получите исключений NullPointerException.
@Before
public void beforeTest() {
Injector injector = new GuiceInjectorBuilder().bindings(bind(TagRepository.class).toInstance(new TagRepository())).injector();
tagService = injector.instanceOf(TagService.class);
}
@Injected
, и поэтому вы получаете исключение. - person mr. Holiday   schedule 07.09.2015