使用单独的类加载器运行每个 JUnit 测试(不,真的)

2022-09-03 07:07:08

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

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

在我进一步讨论之前,我想绝对明确地表明,我确实想这样做。

  • 我无法控制图书馆。
  • 我没有不使用静态变量的选项。
  • 我不想使用反射或Powermock,因为我不想知道图书馆里发生了什么。
  • 我不想使用Maven配置来分叉测试过程,因为这样测试实用程序就绑定到构建工具上。

我在StackOverflow上找到的所有其他答案都只是说“不要那样做”,这没有帮助。第一个回答“静态变量是愚蠢的”的人赢得甜甜圈。


答案 1

最后,我写了我自己的,松散地基于另一个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>

要使用它来相应地注释测试类,请执行以下操作:

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

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


答案 2

MyFaces有一个TestPerClassLoaderRunner,它(尽管它的名字)是你正在寻找的。


推荐