是否可以查询传递给Mockito模拟对象的参数?

时间:2011-06-23 16:10:45

标签: java mockito

我正在学习Mockito,我正在做的一件事就是巩固我的学习是将旧的JUnit测试从使用手动模拟类转换为使用Mockito模拟的类。但是,我遇到了一个我不确定如何处理的情况。

具体来说,我的测试单元构造了一个String,它作为方法调用中的参数传递给模拟对象。我想测试String是否构造正确。挑战在于String的一部分是一个内部生成的哈希键,并在每次调用时都会发生变化。一个可行的解决方案是在我的控制下生成哈希生成并为测试执行注入一个虚拟生成器。但是,这是一项相当有意义的工作。

我的旧手滚动模拟类将存储传递给它的参数,我可以在测试中查询。这允许我通过以下内容查询String的开头和结尾:

assertTrue(mockFtpClient.getFilePathAndName().startsWith("/data/inbound/XJSLGG."));
assertTrue(mockFtpClient.getFilePathAndName().endsWith(".pdf"));

这足以满足我的口味。所以我的问题是,是否有可能使用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));

Mockito的javadoc表示ArgumentCaptor通常是一个更好的选择,当你有一个特定的参数匹配需求时,就像我在这里一样。

2 个答案:

答案 0 :(得分:3)

基本上你需要在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) {
    }
}

您可以使用通用匹配器,也可以使用通用匹配器的组合。

答案 1 :(得分:1)

看一下这个问题的接受答案mockito-how-to-make-a-method-return-an-argument-that-was-passed-to-it它会告诉你如何获取传递给你的模拟方法调用的参数。