Mockito验证使用正则表达式使用正确的参数调用方法

时间:2015-01-20 11:56:19

标签: java regex tdd mockito bdd

描述

我正在尝试测试以下类:

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的参数,然后我想知道是否可以对它进行某种正则表达式检查。换句话说,我想:

  • 捕获提供给日志对象的参数(我在我的测试中嘲笑)
  • 检查(使用正则表达式)是否匹配"候选人#\ d +等模式:不同步"对于我的模拟候选对象返回false
  • 的情况

测试代码

以下代码是我的起点:

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的参数,并确保在使用同步无效的候选项调用它时,记录器对象会正确记录候选者未同步的事件。

编辑:如果之前有人问过,我道歉。我恳请您发布相关问题的链接:)

3 个答案:

答案 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-patternsJavaHamcrest issue #2