ResourceBundle.getBundle尽管有mockStatic和when()仍返回实际对象,但仍返回实际对象

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

我正在对现有类进行测试。他们中的许多人将资源束定义为私有final字段,当通过new创建对象时初始化该资源束。我声明了一个模拟的ResourceBundle,使用PowerMock的mockStatic方法启用静态模拟,并模拟getBundle方法来返回模拟的ResourceBundle。但是,当构造函数运行代码以初始化字段时,它只是创建新的资源束,而不是使用模拟的资源束。我觉得我错过了一个小细节,但我不知道它可能是什么。所有这些都是问题的原因是这样的:当我在本地运行测试时,它将创建ResourceBundle对象而不会出现问题。但是,当通过我们的构建软件(UCBuild)运行该测试时,它将引发“找不到资源”异常,并且该测试因而构建失败。

[当我在调试中运行测试并在构造函数上设置方法断点时,我可以看到“字符串”对象是使用实际资源包而不是模拟资源包创建的。我无法一生找出原因。

我尝试声明该字段而不对其进行初始化,然后使用class.getDeclaredField()和Field.setAccesible()将资源束设置为指向我的模拟对象,但是,如果我运行该代码,这当然会被覆盖重新初始化该字段。

测试Worker.java的WorkerTest类:

@RunWith(PowerMockRunner.class)
@PrepareForTest({FacesContext.class, SaveStatus.class, FacesMessage.class, ResourceBundle.class})
public class WorkerTest {
@Mock
    private ResourceBundle mockRB;

    @Before
    public void setUp() throws Exception {
        PowerMockito.mockStatic(ResourceBundle.class);
        PowerMockito.when(ResourceBundle.getBundle(anyString())).thenReturn(mockRB);
        PowerMockito.when(mockRB.getString(anyString())).thenReturn("tst");

        sut = new Worker();  // Breakpoint here to verify mockRB exists
    }
...some tests
}

Worker.java:

@Named
@ApplicationScoped
public class Worker implements Serializable {
    private static final long serialVersionUID = 4075799125164038417L;
    private final ResourceBundle strings = ResourceBundle
            .getBundle("com.resources.strings");

    public Worker() {  //method breakpoint here

    }

提前感谢

unit-testing junit powermock resourcebundle mockstatic
1个回答
0
投票

发现了问题。将Worker.class添加到@PrepareForTest注释行中,一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.