Как устранить неполадки с перебоями теста Junit? - PullRequest
0 голосов
/ 11 октября 2011

Я имею дело со случаем, когда мои тесты проходят или не проходят в соответствии с порядком объявления.Это, конечно, указывает на не правильно изолированные тесты.Но я в тупик о том, как найти проблему.Дело в том, что мои тесты junit являются производными от класса, который относится к инфраструктуре тестирования, построенной на junit, и имеет некоторый контейнер внедрения зависимостей.Контейнер сбрасывается для каждого теста установкой базового класса, поэтому в контейнере не осталось никаких объектов, по крайней мере, так как сам контейнер новый.Поэтому я склоняюсь к следующему сценарию.

  1. test1 косвенно вызывает некоторый classA, который устанавливает classA.somestaticMember в значение xyz.test obj не поддерживает никаких ссылок на classA напрямую, но classA по-прежнему загружается vm со значением xyz, когда test1 заканчивается.
  2. test2 обращается к classA и отключается на некотором статическом элементе, имеющем значение xyz.

Проблема в том, что а) я не знаю, так ли это на самом деле - как мне найти это?Кажется, я не могу найти ссылку на статическую переменную в коде ... б) есть ли способ сказать junit, чтобы он выгружал все свои загруженные классы и делал это заново для каждого метода тестирования?

1 Ответ

1 голос
/ 11 октября 2011

Вы можете объявить метод с помощью @Before, например

@Before public void init()
{
    // set up stuff
}

, и JUnit будет запускать его перед каждым тестом.Вы можете использовать это для настройки «прибора» (известного набора свежих объектов, данных и т. Д., С которым ваши тесты будут работать независимо друг от друга).

Также есть @After, который вы можетеиспользуйте для выполнения любой очистки, необходимой после каждого теста.Обычно вам не нужно этого делать, поскольку Java очистит все используемые вами объекты, но это может быть полезно для восстановления внешних объектов (вещи, которые вы не создаете и не контролируете) до известного состояния.

(Обратите внимание: если вы полагаетесь на внешние объекты для выполнения своих тестов, то, что у вас есть, больше не является модульным тестом. Вы не можете точно сказать, вызван ли сбой вашимкод или внешний объект, и это одна из целей модульных тестов.)

...