Какой смысл в @Before и @BeforeClass? - PullRequest
1 голос
/ 08 октября 2019

Вместо того, чтобы использовать эти аннотации JUnit 4, почему бы нам просто не использовать статические блоки и инициализаторы экземпляров? Следующий код показывает, что метод @BeforeClass выполняется всякий раз, когда выполняется статический блок инициализатора, а методы @Before запускаются всякий раз, когда выполняется блок инициализатора экземпляра. Так зачем они нам нужны?

public class DemoTest {

    static {
        System.out.println("init static");
    }

    {
        System.out.println("init instance");
    }

    @BeforeClass
    public static void setUpAll() {
        System.out.println("beforeClass");
    }

    @Before
    public void setUp() {
        System.out.println("before");
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }

    @Test
    public void test2() {
        System.out.println("test2");
    }
}

Ответы [ 4 ]

2 голосов
/ 08 октября 2019

Прежде всего, чтобы включить декларативное программирование;использование аннотаций - это просто «как дела» в JUnit, поэтому имеет смысл использовать и эти конструкции здесь.

И обратите внимание: это также для симметрии. У вас есть @After и @AfterClass, которые вы действительно не можете выразить с помощью (статических) блоков кода внутри класса!

2 голосов
/ 08 октября 2019

Вы, конечно, можете использовать их, если ваши тестовые примеры не требуют дополнительных функций, предоставляемых @Before и т. Д.

Поскольку вы не можете сделать то же самоеоднако, как @After и @AfterClass с этими конструкциями, имеет смысл для симметрии, возможности повторного использования и читабельности включать их в одном формате.

Кроме того, для таких вещей, как @Rule и @ClassRule аннотированные поля(а также аннотированный @Mock, если вы используете MockitoJUnit4Runner или @Autowired, если вы используете SpringJUnitRunner), они гарантированно будут инициализированы к моменту ввода соответствующего @Before и т. д. метод в Юнит. Нет такой гарантии (на самом деле, есть гарантия, что они не будут ), если вы используете блоки инициализации static / instance.

1 голос
/ 08 октября 2019

@ BeforeClass метод запускается всякий раз, когда выполняется статический блок инициализатора

Важным предупреждением здесь является то, что это утверждение неверно. Блок статического инициализатора запускается , когда класс загружен , что необязательно, когда вы должны выполнять тесты.

Перемещение @BeforeClass в блок static-init означает, что он вызывается только один разна каждую загрузку классов, что означает, что вы больше не можете выполнять тест несколько раз, не перезагружая класс в первую очередь (что довольно сложно).

Важно также отметить, что @BeforeClass не предназначены для подготовки вашеготестовый класс для использования - он предназначен для подготовки остальной части вашей системы к выполнению тестов - и по этой причине обычно каждый @BeforeClass и @Before должен дополняться соответствующим @AfterClassи @After соответственно, чтобы после выполнения всех тестов система очищалась.

0 голосов
/ 08 октября 2019

Вот ссылка на junit 4 javadocs ;обоснование каждой аннотации включено в описание аннотации.

Прямо из JUnit JavaDocs:

Для @Before

При написании тестов,Общеизвестно, что несколько тестов нуждаются в похожих объектах, созданных до их запуска. Аннотирование открытого метода void с помощью @Before приводит к тому, что этот метод запускается перед методом Test. Методы @Before суперклассов будут выполняться до методов текущего класса, если они не переопределены в текущем классе. Никакой другой порядок не определен.

Для @BeforeClass

Иногда нескольким тестам необходимо использовать вычислительно дорогостоящие настройки (например, вход в базу данных). Хотя это может поставить под угрозу независимость тестов, иногда это является необходимой оптимизацией. Аннотирование открытого статического метода void no-arg с помощью @BeforeClass заставляет его запускаться один раз перед любым из тестовых методов в классе. Методы @BeforeClass для суперклассов будут выполняться до методов текущего класса, если они не скрыты в текущем классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...