java – 使用独立的ClassLoader运行每个JUnit测试(不,真的)

我如何让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>作为查找地图中的关键.

相关文章

背景 阿里java开发规范是阿里巴巴总结多年来的最佳编程实践,...
# 前言 在面试这一篇我们介绍过[CountDownLatch和CyclicBarr...
多线程编程是每一个开发必知必会的技能,在实际项目中,为了...
背景 在我们系统中有这么一个需求,业务方会通过mq将一些用户...
# 前言 为了更好的进行开发和维护,我们都会对程序进行分层设...
前言 关于动态代理的一些知识,以及cglib与jdk动态代理的区别...