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)
知道我做错了什么吗?
谢谢.
为什么要费心模拟对资源包的调用呢?一般来说,我尽量避免嘲笑 java 的具体细节,例如 ArrayList、Date 等。资源包(和 MessageFormat.format())对我来说或多或少属于同一类别。它们通常对基本的字符串进行操作,如果这些东西被破坏或改变它们的行为足以破坏测试,这绝对是我想知道的:)
只需让他们获取字符串(大概将在 UI 中设置,可能是在 后)。不必费心去断言返回的值,因为您不希望对包进行编辑来破坏您的测试。如果字符串被设置在模拟 UI 组件上,这是 anyObject(String.class) 的好地方,它正确地表达了您(可能)实际上并不关心显示的特定字符串的事实。
当测试由于缺少消息密钥而失败时,我也认为这是一个好处。我想知道。
| 归档时间: |
|
| 查看次数: |
5309 次 |
| 最近记录: |