使用 PowerMockito 和 @BeforeClass 的一般夹具设置

General Fixture Setup with PowerMockito and @BeforeClass

我有一个测试,我在其中配置了一些通用装置,但是在使用 PowerMockRule 之后,我在 @BeforeClass 方法中配置的静态变量重置为 null。这会导致以下测试失败,但是如果您删除 PowerMockRule 它会通过。

public class Test
{
    @Rule
    public PowerMockRule rule = new PowerMockRule();

    private static String MyString;

    @BeforeClass
    public static void setupClass() throws Exception
    {
        MyString = "FOO";
    }

    @org.junit.Test
    public void test() throws Exception
    {
        assertEquals("FOO", MyString);
    }
}

我有答案,但你不会喜欢的。

简短回答:它看起来像是 PowerMock 中的一个缺陷,因此 create a issue 在我们的错误跟踪器中

长答案:您可能知道 PowerMock 能够通过自定义 class 加载器模拟静态、私有等加载 classes 和修改后的字节码。然后使用 @PowerMockRunner 然后 PowerMock 可以控制加载测试 class 并且测试 class 也由自定义 class 加载程序加载。如果另一个 jUnitRunner 运行测试并使用 PowerMockRule,则测试 class 和测试所需的所有其他 class 将使用标准 class 加载程序加载。 PowerMock 通过使用 serializing/deserializing 或 objenesis 的深度处理来重新加载所有这些 classes。因此,当 class 被重新加载时,所有初始化的静态字段都是 null

我已经简要检查了代码,但我没有找到针对您的案例的测试,并且我们处理了 @BeforeClass,所以 create a issue 在我们的错误跟踪器中,我会深入检查它。

顺便也请指出你用的是哪个版本,用的是什么依赖。