Подтвердить что ты не робот

Инъектор Guice в тестах JUnit

Использование Guice - хорошая практика для получения нового инжектора в каждом тестовом классе JUnit, поскольку каждый тестовый класс должен быть независимым?

4b9b3361

Ответ 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, и таким образом их очень просто повторно использовать.