Запускайте каждый тест JUnit с помощью отдельного ClassLoader (нет, действительно)
Как я могу использовать JUnit отдельный ClassLoader
для каждого тестируемого класса, который он выполняет?
Я пишу JUnit TestRunner
для библиотеки, которая устанавливает множество статических переменных. Я по существу хочу reset все это между каждым тестовым классом, не зная, что все они есть. Я не хочу быть связанным с глубоким знанием структуры, так как всякий раз, когда библиотека меняет внутренне, мой TestRunner
будет ломаться.
Прежде чем я пойду дальше, я хочу совершенно ясно, что я действительно хочу это сделать.
- У меня нет контроля над библиотекой.
- У меня нет возможности не использовать статические переменные.
- Я не хочу использовать отражение или Powermock, поскольку я не хочу знать, что происходит в библиотеке.
- Я не хочу использовать конфигурацию Maven для процессов проверки вилки, так как утилита тестирования привязана к инструменту построения.
Каждый другой ответ, который я могу найти в StackOverflow, просто говорит "не делай этого", что не помогает. Первый человек, который отвечает "статическими переменными, тупыми", выигрывает пончик.
Ответы
Ответ 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, который (несмотря на его название), что вы ищете.