我正在尝试测试以下类:
Class UserSynchronizer(){
private static org.apache.log4j.Logger log = ... ;
public Sync(candidate) {
...
if (candidate.inValidForSync()) {
log.debug("Candidate #" + candidate.getId() + ": Not syncing");
}
else {
log.debug("Syncing");
}
}
}
我想知道mockito是否可以检测调用了log.debug
的参数,然后我想知道是否可以对它进行某种正则表达式检查。换句话说,我想:
以下代码是我的起点:
public void verifySyncDoesntSyncWhenInvalid(){
//Setup candidate mock
Candidate invalidSyncCandidateMock = mock(Candidate.class);
when(invalidSyncCandidateMock.inValidForSync()).thenReturn(true);
//Setup log mock
UserSynchronizer userSynchronizer = ...;
Field logField = userSynchronizer.getClass().getDeclaredField("log");
logField.setAccessible(true);
logField.set(userSynchronizer, logMock);
//Call sync
userSynchronizer.sync(invalidSyncCandidateMock);
//Verify that debug was called with ("Candidate #\d+: Not syncing")
???
}
问题是多次调用log.debug
。我想捕获提供给log.debug
的参数,并确保在使用同步无效的候选项调用它时,记录器对象会正确记录候选者未同步的事件。
编辑:如果之前有人问过,我道歉。我恳请您发布相关问题的链接:)
答案 0 :(得分:7)
Mockito在标准org.mockito.Matchers课程中提供正则表达式匹配器。下面是一个示例,说明如何使用此函数验证具有适当参数值的调用:
verify(restMock, times(1)).exchange(matches(".*text=welcome.*to.*blah"), eq(HttpMethod.GET), any(ResponseEntity.class), eq(String.class));
答案 1 :(得分:1)
您可以使用:
final List<String> messages = new ArrayList<>();
final Answer<Void> catchMeAll = new Answer<Void>()
{
@Override
public Void answer(final InvocationOnMock invocation)
{
messages.add((String) invocation.getArguments()[0]);
}
}
doAnswer(catchMeAll).when(logMock).debug(anyString());
(注意:此代码假定Logger
&#39; .debug()
方法返回void
;我不知道任何Logger
不,但谁知道)
答案 2 :(得分:1)
另一种匹配方法是使用具有正则表达式的Hamcrest匹配器:
verify(logMock).debug(argThat(matchesPattern("Candidate #\\d+: Not syncing")));
请注意,您必须自己编写,或使用PatternMatcher中未包含的hamcrest-text-patterns
或JavaHamcrest issue #2。