我如何让JUnit为其执行的每个测试类使用一个单独的ClassLoader?
我正在为一个设置很多静态变量的库写一个JUnit TestRunner.我基本上想要在每个测试类之间重置所有这些,而不需要知道它们是什么.我不想与框架的亲密知识相结合,因为只要库内部更改,我的TestRunner就会中断.
在我走之前,我想明确地说,我真的很想这样做.
>我没有图书馆的控制权.
>我没有选择不使用静态变量.
>我不想使用反思或Powermock,因为我不想知道图书馆里发生了什么.
>我不想使用Maven配置来分支测试过程,因为测试实用程序与制作工具绑定在一起.
我可以在StackOverflow上找到的其他答案只是说“不要这样做”,这是没有帮助的.第一个用“静态变量是哑”回答的人赢了一个甜甜圈.
解决方法
最后我写了自己,松散地基于
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>
使用它相应地注释你的测试类:
@RunWith(QuarantiningRunner.class) @Quarantine({"com.binarytweed"}) public class MyIsolatedTest { ...
因为测试类本身需要加载到单独的ClassLoader中,因此链接的答案对我来说并不起作用,因为所引用的所有类将使用相同的加载器.隔离是包容性的(而不是排他的),因为您需要由父ClassLoader加载的JUnit @Test注释,否则JUnit无法找到任何可测试的方法,因为它使用Class&Test>作为查找地图中的关键.