使用 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 在我们的错误跟踪器中,我会深入检查它。
顺便也请指出你用的是哪个版本,用的是什么依赖。
我有一个测试,我在其中配置了一些通用装置,但是在使用 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 在我们的错误跟踪器中,我会深入检查它。
顺便也请指出你用的是哪个版本,用的是什么依赖。