我现在正在学习Mockito,我正在做的一件事就是巩固我的学习是将旧的JUnit测试从使用手动模拟类转换为使用Mockito模拟的类.但是,我遇到了一个我不确定如何处理的情况.
具体来说,我的测试单元构造一个String传递给模拟对象的单元作为方法调用的参数.我想测试一下String是否构造正确.挑战在于,部分String内容是在内部生成并在每次调用时发生变化的散列键.一个可行的解决方案是在我的控制下生成哈希生成并为测试执行注入一个虚拟生成器.但是,这是一项相当多的工作.
我的旧手滚动模拟类将存储传递给它的参数,我可以在我的测试中查询.这允许我String通过以下方式查询via的开头和结尾:
assertTrue(mockFtpClient.getFilePathAndName().startsWith("/data/inbound/XJSLGG."));
assertTrue(mockFtpClient.getFilePathAndName().endsWith(".pdf"));
Run Code Online (Sandbox Code Playgroud)
这足以满足我的口味.所以我的问题是,是否可以使用Mockito查询或获取传递给方法的参数,以便我可以执行与上述类似的操作?
更新24/06/2011:此时我已经除了Gnon的答案.但是,我发现了一些对我有用的东西.即ArgumentCaptor.以下是它的工作原理:
ArgumentCaptor<String> fileNameArgument = ArgumentCaptor.forClass(String.class);
verify(mockFtpClient).putFileOnServer(fileNameArgument.capture());
assertTrue(fileNameArgument.getValue().startsWith(START_FILE_NAME) &&
fileNameArgument.getValue().endsWith(END_FILE_NAME));
Run Code Online (Sandbox Code Playgroud)
Mockito状态的javadoc ArgumentCaptor通常是一个更好的选择,当你有一个特定的参数匹配要求时,就像我在这里做的那样.
基本上,您需要在 Mockito 中使用argThat(),它可以让您将 Hamcrest Matcher视为验证参数。以下是用于对传入参数进行自定义断言的代码:
@Test
public void testname() throws Exception {
HashReceiver receiver = mock(HashReceiver.class);
receiver.set("hash");
verify(receiver).set(argThat(new HashMatcher()));
}
class HashMatcher extends BaseMatcher<String> {
@Override
public boolean matches(Object item) {
String hash = (String) item;
if (hash.startsWith("/data/inbound/XJSLGG.") && hash.endsWith(".pdf"))
return true;
return false;
}
}
// Mocked
class HashReceiver {
public void set(String hash) {
}
}
Run Code Online (Sandbox Code Playgroud)
您也许可以使用通用匹配器或通用匹配器的组合。
| 归档时间: |
|
| 查看次数: |
2557 次 |
| 最近记录: |