Базовая функциональность JUnit 4 - PullRequest
5 голосов
/ 07 июня 2011

Как правильно использовать JUnit 4 для создания тестовых случаев для использования общих функций: например, настройка, которая является общей для нескольких классов модульных тестов? Я создал тестовый пример и поместил общую функциональность в метод @Before, тогда любой тестовый случай, который нуждается в этом, расширил бы базовый класс. Тем не менее, это, кажется, требует выполнения: super.setUp() в каждом подклассе.

Есть ли лучший способ?

EDIT

На самом деле предложенное мной решение не работает. Иногда JUnit будет вызывать базовый класс ДВАЖДЫ. Один раз, если это случится, сначала запустить тест в базовом классе, и снова, когда он достигнет дочернего класса (по крайней мере, я думаю, что это происходит). Так что лучший способ «унаследовать» функциональность общего тестового примера был бы великолепен.

Ответы [ 4 ]

5 голосов
/ 07 июня 2011

Вам не нужно вызывать super.setup(), если вы используете аннотацию @Before :

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

Я бы предложил что-то вроде этого:

  @Before
  public void initForAll() {}

В классе Super / Main

и любые

  @Before
  public void initTest() {...}

В ваших тестовых случаях.

РЕДАКТИРОВАТЬ:

Чтобы ответить на ваши вопросы в режиме редактирования.

  1. Вы можете использовать @BeforeClass, который будет вызываться один раз для TestClass.
  2. Но я думаю, что вы ищете что-то вроде ленивой / статической инициализации.

Я делаю это так:

private boolean initialized = false;

@BeforeClass
public static void init()
{
  if(initialized)
  {
    return;
  }

  //Initialize everything

  initialized = true;
}
0 голосов
/ 14 февраля 2013

Если ваш базовый класс имеет метод public void setUp (), как и ваш подкласс, то метод setUp подкласса переопределяет метод базового класса с тем же именем и сигнатурой, поэтому будет вызываться только метод подкласса (и он может быть вызван, когда должен был быть вызван метод базового класса; не уверен в этом).

Решение состоит в том, чтобы вызвать ваш метод установки базового класса как-нибудь еще, например. baseSetup (). Тогда они оба будут вызваны автоматически. Ответ Иоахима действительно касается именования, но я хотел бы прояснить последствия переопределения метода.

0 голосов
/ 08 июня 2011

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

0 голосов
/ 07 июня 2011

это довольно хороший способ сделать это. Если у вас есть setUp() в подклассе, тогда да, вы должны вызвать super.setUp(), но на самом деле, насколько это сложно?

...