#java #testing #jakarta-ee #junit #integration-testing
#java #тестирование #джакарта-ee #junit #интеграция-тестирование
Вопрос:
Мне нужно иметь возможность имитировать вложенные классы, которые были введены с помощью JUnit, чтобы я мог создавать тесты характеристики. Проблема заключается в:
класс 1 использует объект класса 2, а класс 2 использует объект класса 3. И объект класса 3 равен нулю, когда тест выполняется для метода класса 1
это структура классов, которая у меня есть:
class 1 {
@Inject private Class2 class2 ;
}
class 2 {
@Inject private Class3 class3 ;
}
мой набор тестов должен запускаться сверху вниз, чтобы полностью протестировать мою систему, поскольку это старая система, и мне нужно писать тесты, начиная с вершины, чтобы постепенно ее реорганизовать.
Набор тестов:
@RunWith(MockitoJUnitRunner.class)
public class Class1Test {
@Mock
Class3 class3;//this doesn't work object remains null inside of mocked class2
@Mock
Class2 class2; //this injection works and the object isn't null inside of class1
@InjectMocks
public Class1 class1;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testFunction()
{
assertNotNull(class1.exampleFunction());
}
}
Я знаю, что правильный способ — заглушка зависимостей, но эта кодовая база слишком велика, чтобы писать модульные тесты для каждого уровня, мне нужно иметь возможность писать тесты в JUnit, чтобы я мог запускать эти тесты во время рефакторинга кодовой базы, чтобы убедиться, что я ничего не сломал, поэтому почемуЯ не использовал postman, так как мне нужно, чтобы это было быстро.
в java 8 @inject — это java-аннотация с использованием JUnit 4, но я думаю, что могу использовать junit5, если мне нужно. проект представляет собой приложение j2ee (java ee)
Ответ №1:
Если я правильно понял проблему, класс 1 использует объект класса 2, а класс 2 использует объект класса 1. И объект класса 3 равен нулю, когда тест выполняется для метода класса 1.
Вы можете использовать глубокую заглушку для класса 2.
@Mock(answers=Answers.RETURNS_DEEP_STUBS)
Class class2;
Комментарии:
1. нет, на самом деле это так: класс 1 использует объект класса 2, а класс 2 использует объект класса 3. И объект класса 3 равен нулю, когда тест выполняется для метода класса 1
2. ДА. Здесь будет работать глубокое заглушение. Попробуйте это.