PowerMock setInternalState对于使用吸气剂的最终字段不起作用

问题描述 投票:0回答:1

我有这样的课程。

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确实看起来很奇怪。请忽略它。

java unit-testing mocking powermock powermockito
1个回答
0
投票

尝试像这样注入字段:

@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());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.