Использование Guice - хорошая практика для получения нового инжектора в каждом тестовом классе JUnit, поскольку каждый тестовый класс должен быть независимым?
Инъектор Guice в тестах JUnit
Ответ 1
Посмотрите Guice Berry.
Я не буду рекомендовать использовать его сейчас (документация действительно ужасная), но, глядя на их подход, вы можете подумать о том, как сделать DI в jUnit.
Ответ 2
Вы действительно должны избегать использования Guice в модульных тестах, поскольку каждый тест должен быть достаточно мал, чтобы ручной DI был управляемым. Используя Guice (или любой DI) в модульных тестах, вы скрываете предупреждение о том, что ваш класс становится большим и принимает слишком много обязанностей.
Для тестирования кода загрузочного кода и тестов интеграции да, создайте другой инжектор для каждого теста.
Ответ 3
Если кто-то наткнется на этот вопрос и захочет посмотреть, как получить аннотации Guice, работающие с модульными тестами, расширьте свои тесты из базового класса, подобного приведенному ниже, и вызовите injector.injectMembers(this);
public class TestBase {
protected Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(HelloService.class);
}
});
@Before
public void setup () {
injector.injectMembers(this);
}
}
Затем ваш тест может получить введенный HelloService
, как этот
public class HelloServiceTest extends TestBase {
@Inject
HelloService service;
@Test
public void testService() throws Exception {
//Do testing here
}
}
Ответ 4
Я думаю, что использование DI
сделает код unit test более простым, я всегда использую DI для unit test, а также для теста интеграции.
Без DI все сложно программировать. Либо используйте Guice Inject or Spring Autowired
. как мой тестовый код ниже:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/application-context.xml")
public class When_inexists_user_disabled {
@Autowired
IRegistrationService registrationService;
private int userId;
@Before
public void setUp() {
Logger.getRootLogger().setLevel(Level.INFO);
Logger.getLogger("org.springframework").setLevel(Level.WARN);
BasicConfigurator.configure();
userId = 999;
}
@Test(expected=UserNotFoundException.class)
public void user_should_have_disabled() throws UserNotFoundException {
registrationService.disable(userId);
}
}
Ответ 5
Я нашел AtUnit, чтобы стать отличным дополнением к Guice (он даже имеет дело с интеграцией с макетными фреймами).
Это делает классы Unit Test предельно ясными и краткими (никогда не видя там Injector
) и, при необходимости, также позволяет вам выполнять свои производственные привязки как часть ваших модульных тестов.
Ответ 6
Я предлагаю эту структуру, которую я недавно написал Guice-Behave.
Это очень просто, с двумя аннотациями вы можете запустить тест в том же контексте вашего приложения.
Вы можете определить свои mocks внутри модуля Guice, и таким образом их очень просто повторно использовать.