вложенные фиктивные инъекции junit для тестов определения характеристик

#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. ДА. Здесь будет работать глубокое заглушение. Попробуйте это.