#java #unit-testing #junit #junit5
#java #модульное тестирование #junit #junit5
Вопрос:
Предположим, у меня есть один контроллер и несколько сервисов в этом.
Class Controller1{
private ServiceA servicea;
}
Class ServiceA {
private ServiceB serviceb;
}
Class ServiceB {
private ServiceC servicec;
private Utility utility;
}
Class ServiceC {
private Dao dao;
}
В примере bouve, если я хочу написать модульный тест для ServiceA, я должен смоделировать ServiceB.
Первый вопрос: тестирование только одного класса обслуживания не имеет для меня большого значения, потому что все это связанные сервисы и работают вместе.
Могу ли я внедрить ServiceB, а также ServiceC в ServiceB вместо того, чтобы издеваться над ними?
В принципе, я не хочу никакого класса serivces. Я хочу издеваться только над слоями Dao.
Но проблема в том, что Dao находится на самом высоком уровне.
Как я могу решить эту проблему? Любая помощь приветствуется.
Мой пример кода
@ExtendWith(MockitoExtension.class)
@TestInstance(Lifecycle.PER_CLASS)
public class ServiceTest {
@InjectMocks
ServiceA servicea;
@Mock
ServiceB serviceb;
@Mock
ServiceC servicec;
@Test
public void testFeatureOne()
{
}
}
Ответ №1:
Тестирование только одного класса обслуживания не имеет для меня большого значения, потому что все это связанные сервисы и работают вместе.
Вы хотите выполнять модульные тесты или интеграционные тесты? Если вам нужны модульные тесты, вам следует протестировать каждую службу отдельно. Используя Mockito, вы можете как определять ответы поддельных сервисов, так и проверять, действительно ли тестируемая служба взаимодействует с базовыми поддельными сервисами.
Если вы действительно хотите выполнить интеграционные тесты всех сервисов одновременно, с этим тоже нет проблем. Я полагаю, вы могли бы сделать что-то подобное, вручную:
@ExtendWith(MockitoExtension.class)
@TestInstance(Lifecycle.PER_CLASS)
public class ServiceTest {
ServiceA servicea;
ServiceB serviceb;
ServiceC servicec;
@Mock
Dao dao;
@BeforeEach
public void setUp(){
servicec = new ServiceC(dao);
serviceb = new ServiceB(servicec, new Utility());
servicea = new ServiceA(serviceb);
}
@Test
public void testFeatureOne()
{
}
}
Я могу ошибаться, но я предполагаю, что вы могли бы сделать то же самое с @Autowire
аннотацией для всех 3 сервисов и @InjectMock
далее servicec
(сам не пробовал, просто догадываюсь).
Комментарии:
1. Нет, @InjectMock так не работает. Здесь классы служб являются вложенными. На самом деле у нас мало сложного приложения, и несколько служб общаются друг с другом, чтобы получить решение.
Ответ №2:
Я могу ошибаться, но вы не хотите unittest, а тест интеграции.