我有这样的课程。
public class ExampleClass {
private final String finalString = "final";
public String getFinalString() {
return finalString;
}
}
这是我的示例测试类,试图更改finalString
的值
@RunWith(PowerMockRunner.class)
@PrepareForTest(ExampleClass.class)
public class ExampleClassTest {
private ExampleClass exampleClass = new ExampleClass();
@Before
public void setUp() throws Exception {
Whitebox.setInternalState(exampleClass,"finalString","mocked");
}
@Test
public void name() throws Exception {
assertEquals("mocked", exampleClass.getFinalString()); //failing
}
}
但是在这里,我的主张失败了。 exampleClass.getFinalString()
的值声称为"final"
。
但是当我在断言行调试代码并检查字段finalString
的值时,或者当我尝试使用反射(下面的代码)获取字段finalString
的值时(下面的代码),它将显示"mocked"
值。
我的反射码
Field finalStringField = exampleClass.getClass().getDeclaredField("finalString");
finalStringField.setAccessible(true);
assertEquals("mocked",finalStringField.get(exampleClass)); //passing
任何人都知道这里的把戏吗?
PS:我在最后一场比赛中的getter确实看起来很奇怪。请忽略它。
尝试像这样注入字段:
@RunWith(PowerMockRunner.class)
@PrepareForTest(ExampleClass.class)
public class ExampleClassTest {
private ExampleClass exampleClass;
@Before
public void setUp() throws Exception {
exampleClass = PowerMock.mock(ExampleClass.class, Mocktio.CALL_REAL_METHOD);
Whitebox.setInternalState(exampleClass, "finalString", "mocked");
}
@Test
public void name() throws Exception {
assertEquals("mocked", exampleClass.getFinalString());
}
}