使用PowerMock + EasyMock模拟最终方法

Mik*_*ski 6 easymock powermock

我正试图模拟对最终方法的调用ResourceBundle.getString().使用PowerMock 1.4.12和EasyMock 3.1,呼叫不会被嘲笑; 相反,调用"真实"方法.

我的考试班:

@RunWith(PowerMockRunner.class)
@PrepareForTest(ResourceBundle.class) 
public class TestSuite {
    @Before
    public void setUp() throws Exception {
        ResourceBundle resourceBundleMock = PowerMock.createNiceMock(ResourceBundle.class);
        expect(resourceBundleMock.getString(BundleConstants.QUEUE)).andReturn("Queue");
        PowerMock.replay(resourceBundleMock);

        beanBeingTested.setMessages(resourceBundleMock);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

BeanBeingTested中的代码:

private ResourceBundle messages;
...
String label = messages.getString(BundleConstants.QUEUE);
Run Code Online (Sandbox Code Playgroud)

错误信息:

java.util.MissingResourceException: Can't find resource for bundle $java.util.ResourceBundle$$EnhancerByCGLIB$$e4a02557, key Queue
at java.util.ResourceBundle.getObject(ResourceBundle.java:384)
at java.util.ResourceBundle.getString(ResourceBundle.java:344)
at com.yoyodyne.BeanBeingTested.setUpMenus(BeanBeingTested.java:87)
Run Code Online (Sandbox Code Playgroud)

当我逐步完成测试用例时,调试器会显示类型beanBeingTested.messages为"EasyMock for class java.util.ResourceBundle",因此模拟正确注入.(此外,在设置期间呼叫getString()内的expect()呼叫没有错误).

使用简单的模拟而不是一个很好的模拟,我得到以下错误:

java.lang.AssertionError: 
  Unexpected method call handleGetObject("Queue"): 
    getString("Queue"): expected: 1, actual: 0
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

谢谢.

Gus*_*Gus 0

为什么要费心模拟对资源包的调用呢?一般来说,我尽量避免嘲笑 java 的具体细节,例如 ArrayList、Date 等。资源包(和 MessageFormat.format())对我来说或多或少属于同一类别。它们通常对基本的字符串进行操作,如果这些东西被破坏或改变它们的行为足以破坏测试,这绝对是我想知道的:)

只需让他们获取字符串(大概将在 UI 中设置,可能是在 后)。不必费心去断言返回的值,因为您不希望对包进行编辑来破坏您的测试。如果字符串被设置在模拟 UI 组件上,这是 anyObject(String.class) 的好地方,它正确地表达了您(可能)实际上并不关心显示的特定字符串的事实。

当测试由于缺少消息密钥而失败时,我也认为这是一个好处。我想知道。