使用Separate ClassLoader运行每个JUnit测试(不,真的)

Eng*_*_DJ 14 java junit classloader test-runner

如何让JUnit ClassLoader为它执行的每个测试类使用一个单独的?

我正在TestRunner为一个设置很多静态变量的库编写一个JUnit .我基本上想要在每个测试类之间重置所有这些,而不需要知道它们是什么.我不想加入对框架的深入了解,因为每当库内部发生变化,我的TestRunner意志就会破裂.

在我进一步发展之前,我想明确表示我确实想要这样做.

  • 我无法控制图书馆.
  • 我没有选择不使用静态变量.
  • 我不想使用反射或Powermock,因为我不想知道库中发生了什么.
  • 我不想使用Maven配置来分叉测试过程,因为测试实用程序与构建工具相关联.

我可以在StackOverflow上找到的其他答案只是说"不要那样做",这没有用.第一个回答"静态变量愚蠢"的人赢得了甜甜圈.

Eng*_*_DJ 10

最后我写了自己的,松散地基于另一个Stack Overflow答案(这对我不起作用).

它现在在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>
Run Code Online (Sandbox Code Playgroud)

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

@RunWith(QuarantiningRunner.class)
@Quarantine({"com.binarytweed"})
public class MyIsolatedTest {
...
Run Code Online (Sandbox Code Playgroud)

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