繁体   English   中英

无法使用 PowerMock 覆盖最终类的静态最终变量

[英]Unable to override static final variable of a final class using PowerMock

我正在尝试使用 PowerMock Whitebox setInternalState api 来覆盖最终类的静态最终变量。 但它似乎不起作用。 请参阅下面的示例代码:

具有静态最终变量的最终类:

public final class BuildConfig {
    public static final String BUILD_TYPE = "debug";
}

返回上述变量的辅助类:

public class BuildConfigHelperClass {
    public String getBuildType() {
        return BuildConfig.BUILD_TYPE;
    }
}

测试班

 import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.reflect.Whitebox; import static org.junit.Assert.*; import static org.powermock.api.mockito.PowerMockito.mockStatic; @RunWith(PowerMockRunner.class) @SuppressStaticInitializationFor("BuildConfig") @PrepareForTest({BuildConfigHelperClassTest.class, BuildConfigHelperClass.class, BuildConfig.class}) public class BuildConfigHelperClassTest { private BuildConfigHelperClass subject; @Before public void setUp() { subject = new BuildConfigHelperClass(); } @Test public void shouldReturnDebugBuildType() { assertEquals("debug", subject.getBuildType()); } @Test public void shouldReturnProductionBuildType() { mockStatic(BuildConfig.class); Whitebox.setInternalState(BuildConfig.class, "BUILD_TYPE", "production"); assertEquals("production", subject.getBuildType()); } }

在上面的测试类中,对于第二个测试subject.getBuildType()方法应该返回“生产”,因为我通过 Whitebox 覆盖它,但它总是因为返回值而失败,即“调试”。

任何人都可以指导我了解我所缺少的东西。

编译器正在优化代码,其中:

public class BuildConfigHelperClass {
    public String getBuildType() {
         return BuildConfig.BUILD_TYPE;
   }
}

基本上编译为:

public class BuildConfigHelperClass {
    public String getBuildType() {
         return "debug";
   }
}

所以单元测试是针对没有引用 BuildConfig 的编译代码运行的。

不要直接引用BUILD_TYPE ,而是尝试添加一个静态 getter:

public final class BuildConfig {
    private static final String BUILD_TYPE = "debug";

    public static final String getBuildType() {
        return BUILD_TYPE;
    }
}

然后可以模拟静态方法:

@Test
public void shouldReturnProductionBuildType() {
    mockStatic(BuildConfig.class);
    // Whitebox.setInternalState(BuildConfig.class, "BUILD_TYPE", "production");
    PowerMockito.when(BuildConfig.getBuildType()).thenReturn("production");
    assertEquals("production", subject.getBuildType());
}

这个测试适用于我的本地,尽管其他编译器可能仍然能够优化它并破坏测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM