Подтвердить что ты не робот

Запускайте каждый тест JUnit с помощью отдельного ClassLoader (нет, действительно)

Как я могу использовать JUnit отдельный ClassLoader для каждого тестируемого класса, который он выполняет?

Я пишу JUnit TestRunner для библиотеки, которая устанавливает множество статических переменных. Я по существу хочу reset все это между каждым тестовым классом, не зная, что все они есть. Я не хочу быть связанным с глубоким знанием структуры, так как всякий раз, когда библиотека меняет внутренне, мой TestRunner будет ломаться.

Прежде чем я пойду дальше, я хочу совершенно ясно, что я действительно хочу это сделать.

  • У меня нет контроля над библиотекой.
  • У меня нет возможности не использовать статические переменные.
  • Я не хочу использовать отражение или Powermock, поскольку я не хочу знать, что происходит в библиотеке.
  • Я не хочу использовать конфигурацию Maven для процессов проверки вилки, так как утилита тестирования привязана к инструменту построения.

Каждый другой ответ, который я могу найти в StackOverflow, просто говорит "не делай этого", что не помогает. Первый человек, который отвечает "статическими переменными, тупыми", выигрывает пончик.

4b9b3361

Ответ 1

В конце я написал свой собственный, свободно основанный на еще один ответ (который не работал у меня).

Теперь это на GitHub и Maven Central. https://github.com/BinaryTweed/quarantining-test-runner

<dependency>
    <groupId>com.binarytweed</groupId>
    <artifactId>quarantining-test-runner</artifactId>
    <version>0.0.1</version>
</dependency>

Чтобы использовать его, аннотируйте свои тестовые классы соответственно:

@RunWith(QuarantiningRunner.class)
@Quarantine({"com.binarytweed"})
public class MyIsolatedTest {
...

Связанный ответ не работал у меня, так как сам тестовый класс должен быть загружен в отдельный ClassLoader, так как тогда все классы, на которые он ссылается, будут использовать один и тот же загрузчик. Карантин включен (а не эксклюзивно), поскольку вам нужны аннотации JUnit @Test, которые должны быть загружены родительским ClassLoader, в противном случае JUnit не может найти какие-либо тестовые методы, поскольку использует Class<Test> в качестве ключа на карте поиска.

Ответ 2

MyFaces имеет TestPerClassLoaderRunner, который (несмотря на его название), что вы ищете.