使用Mockito“何时”使用可能包含某些值的参数?

时间:2019-03-01 22:54:30

标签: unit-testing mockito

我是Mockito的新手,正在尝试弄清这种情况是否可能。

我正在尝试模拟一个类,该类有一个接受3个参数的方法,并且根据第一个参数是否包含一些子字符串,我返回了与Mock不同的东西。

有人可以帮我指出我可以使用的东西吗?我一直在挖掘Mockito,还没有运气。

例如,我正在尝试执行以下操作(伪代码):

when(myMock.lookup(anyStringThatContains("abc"), anyString(), anyString())
   .thenReturn(ImmutableList.of(...someItems))

when(myMock.lookup(anyStringThatContains("def"), anyString(), anyString())
   .thenReturn(ImmutableList.of(...otherItems))

另外: 如果我需要检查的字符串包含在参数传递的对象中,该怎么办? 即。如果第一个参数有一个字段line,那又要检查而不是将字符串放在顶层怎么办?

1 个答案:

答案 0 :(得分:1)

您可以使用eq() matcher来匹配确切的字符串:

when(myMock.lookup(eq("abc"), anyString(), anyString())
   .thenReturn(ImmutableList.of(...someItems))

when(myMock.lookup(eq("def"), anyString(), anyString())
   .thenReturn(ImmutableList.of(...otherItems))

如果只需要匹配字符串的一部分,则可以使用matches()(将正则表达式传递给它):

when(myMock.lookup(matches(".*abc.*"), anyString(), anyString())
   .thenReturn(ImmutableList.of(...someItems))

when(myMock.lookup(matches(".*def.*"), anyString(), anyString())
   .thenReturn(ImmutableList.of(...otherItems))

关于加法:如果您的字符串存储在变量中,则可以简单地使用字符串串联:

String str = "abc";
when(myMock.lookup(matches(".*" + str + ".*"), anyString(), anyString())
   .thenReturn(ImmutableList.of(...someItems))

或(如果存储在对象的字段中)-像这样:

MyObject myObject = new MyObject();
myObject.setLine("abc");
when(myMock.lookup(matches(".*" + myObject.getLine() + ".*"), anyString(), anyString())
   .thenReturn(ImmutableList.of(...someItems))