如何使用Mockito检查参数是否包含两个子串?

ttt*_*ppp 24 java unit-testing mockito

我的测试中有一行目前看起来像:

Mockito.verify(mockMyObject).myMethod(Mockito.contains("apple"));
Run Code Online (Sandbox Code Playgroud)

我想修改它以检查参数是否包含"apple""banana".我该怎么做?

Bor*_*vić 32

只需使用Mockito.matches(String),例如:

Mockito.verify(mockMyObject).
  myMethod(
    Mockito.matches("(.*apple.*banana.*)|(.*banana.*apple.*)"
  )
);
Run Code Online (Sandbox Code Playgroud)


小智 13

我认为最简单的解决方案是多次调用verify():

verify(emailService).sendHtmlMail(anyString(), eq(REPORT_TITLE), contains("Client response31"));
verify(emailService).sendHtmlMail(anyString(), eq(REPORT_TITLE), contains("Client response40"));
verify(emailService, never()).sendHtmlMail(anyString(), anyString(), contains("Client response30"));
Run Code Online (Sandbox Code Playgroud)

  • 我不同意你的回答,因为它可能是不同的方法调用,你无法确定。仅供参考,我没有投票否决你的答案。 (2认同)

Tor*_*ten 5

 Mockito.verify(mockMyObject)
     .myMethod(Mockito.argThat(s -> 
         s.contains("apple") && s.contains("banana"));
Run Code Online (Sandbox Code Playgroud)


小智 5

也许这不再相关,但我找到了另一种方法,按照 Torsten answer 和 this other answer。就我而言,我使用了 Hamcrest Matchers

Mockito.verify(mockMyObject).myMethod(
   Mockito.argThat(Matchers.allOf(
      Matchers.containsString("apple"),
      Matchers.containsString("banana"))));
Run Code Online (Sandbox Code Playgroud)