运行 每个 JUnit 测试都有一个单独的类加载器(不,真的)
Run each JUnit Test with a Separate ClassLoader (no, really)
我如何让 JUnit 对它执行的每个测试 class 使用单独的 ClassLoader
?
我正在为设置大量静态变量的库编写 JUnit TestRunner
。我基本上想在每次测试 class 之间重置所有这些,而不需要知道它们是什么。我不想与框架的深入知识相结合,因为每当库内部发生变化时,我的 TestRunner
就会崩溃。
在我继续之前,我想非常清楚地表明我确实想要这样做。
- 我无法控制图书馆。
- 我没有不使用静态变量的选项。
- 我不想使用反射或 Powermock,因为我不想知道库中发生了什么。
- 我不想使用 Maven 配置来分叉测试进程,因为测试实用程序会绑定到构建工具。
我在 Whosebug 上找到的所有其他答案都只是说 "don't do that," 这没有帮助。第一个回答 "static variables are dumb" 的人将赢得一个甜甜圈。
MyFaces 有一个 TestPerClassLoaderRunner,它是(尽管它的名字)你要找的东西。
最后我写了自己的,松散地基于 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>
要使用它,请相应地注释您的测试 classes:
@RunWith(QuarantiningRunner.class)
@Quarantine({"com.binarytweed"})
public class MyIsolatedTest {
...
链接的答案对我不起作用,因为测试 class 本身需要在单独的 ClassLoader
中加载,因为它引用的所有 classes 都将使用同一个装载机。隔离是包容性的(而不是排他性的),因为您需要 JUnit @Test
注释由父 ClassLoader
加载,否则 JUnit 找不到任何可测试的方法,因为它使用 Class<Test>
作为键入查找映射。
我如何让 JUnit 对它执行的每个测试 class 使用单独的 ClassLoader
?
我正在为设置大量静态变量的库编写 JUnit TestRunner
。我基本上想在每次测试 class 之间重置所有这些,而不需要知道它们是什么。我不想与框架的深入知识相结合,因为每当库内部发生变化时,我的 TestRunner
就会崩溃。
在我继续之前,我想非常清楚地表明我确实想要这样做。
- 我无法控制图书馆。
- 我没有不使用静态变量的选项。
- 我不想使用反射或 Powermock,因为我不想知道库中发生了什么。
- 我不想使用 Maven 配置来分叉测试进程,因为测试实用程序会绑定到构建工具。
我在 Whosebug 上找到的所有其他答案都只是说 "don't do that," 这没有帮助。第一个回答 "static variables are dumb" 的人将赢得一个甜甜圈。
MyFaces 有一个 TestPerClassLoaderRunner,它是(尽管它的名字)你要找的东西。
最后我写了自己的,松散地基于 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>
要使用它,请相应地注释您的测试 classes:
@RunWith(QuarantiningRunner.class)
@Quarantine({"com.binarytweed"})
public class MyIsolatedTest {
...
链接的答案对我不起作用,因为测试 class 本身需要在单独的 ClassLoader
中加载,因为它引用的所有 classes 都将使用同一个装载机。隔离是包容性的(而不是排他性的),因为您需要 JUnit @Test
注释由父 ClassLoader
加载,否则 JUnit 找不到任何可测试的方法,因为它使用 Class<Test>
作为键入查找映射。