运行 每个 JUnit 测试都有一个单独的类加载器(不,真的)

Run each JUnit Test with a Separate ClassLoader (no, really)

我如何让 JUnit 对它执行的每个测试 class 使用单独的 ClassLoader

我正在为设置大量静态变量的库编写 JUnit TestRunner。我基本上想在每次测试 class 之间重置所有这些,而不需要知道它们是什么。我不想与框架的深入知识相结合,因为每当库内部发生变化时,我的 TestRunner 就会崩溃。

在我继续之前,我想非常清楚地表明我确实想要这样做。

我在 Whosebug 上找到的所有其他答案都只是说 "don't do that," 这没有帮助。第一个回答 "static variables are dumb" 的人将赢得一个甜甜圈。

MyFaces 有一个 TestPerClassLoaderRunner,它是(尽管它的名字)你要找的东西。

最后我写了自己的,松散地基于 another Stack Overflow answer(这对我不起作用)。

它现在在 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>

要使用它,请相应地注释您的测试 classes:

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

链接的答案对我不起作用,因为测试 class 本身需要在单独的 ClassLoader 中加载,因为它引用的所有 classes 都将使用同一个装载机。隔离是包容性的(而不是排他性的),因为您需要 JUnit @Test 注释由父 ClassLoader 加载,否则 JUnit 找不到任何可测试的方法,因为它使用 Class<Test> 作为键入查找映射。