В чем разница между этими двумя версиями кода в JUnit?

#java #junit

#java #junit

Вопрос:

В чем разница между кодом в Junit:

 class MethodsTest {
    Methods methods = new Methods();
}
  

и эти:

 class MethodsTest {

    Methods methods;
    @BeforeEach
    void init() {
        methods = new Methods();
    }
}
  

Когда использовать первый код, а когда второй код?

Ответ №1:

В первой версии вы надеетесь, что конкретный тестовый запуск, который вы используете, создает новый экземпляр MethodsTest , неявно создавая новый экземпляр Methods при выполнении конкретного теста. Во второй версии вы сообщаете тестировщику, который вы явно используете для создания нового экземпляра Methods при выполнении нового теста.

Ответ №2:

Если не задействовано наследование, то нет никакой разницы.

Если бы вам нужно было расширить MethodsTest класс, вы могли бы переопределить init() метод, и переопределяющий метод не обязательно инициализировал бы поле напрямую или, возможно, косвенно путем вызова super.init() ; или он мог бы инициализировать его по-другому.

Лично я предпочел бы первую. Он более лаконичный, не переопределяемый, и его семантика очевидна любому, кто знаком с Java, даже без специфичных для JUnit знаний.