gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:23:02 24 4
gpt4 key购买 nike

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

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

我的旧手工模拟类将存储传递给它的参数,我可以在我的测试中查询这些参数。这使我可以通过以下方式查询 String 的开始和结束:

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

这对我的品味来说已经足够了。所以我的问题是,是否可以使用 Mockito 查询或获取传递给方法的参数,以便我可以执行与上述类似的操作?

2011 年 6 月 24 日更新:在这一点上,我已经排除了 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 通常是更好的选择,就像我在这里所做的那样。

最佳答案

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

您可以改用通用匹配器或通用匹配器的组合。

关于java - 是否可以查询传递给 Mockito 模拟对象的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6457245/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com