使用一个单独的ClassLoader运行每个JUnit测试(实际上不是)



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

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

在我进一步讨论之前,我想明确一点,我真的很想这样做。

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

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

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

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

MyFaces有一个TestPerClassLoaderRunner,它(尽管有名字)就是您想要的。

相关内容

  • 没有找到相关文章

最新更新