如何编写一个不等于某事的匹配器

Chu*_*urk 45 java junit matcher mockito

我正在尝试为通话创建一个模拟器.说我有这个方法我试图存根:

class ClassA {
  public String getString(String a) {
    return a + "hey";
  }
}
Run Code Online (Sandbox Code Playgroud)

我想嘲笑的是:第一个例子是

when(classA.getString(eq("a")).thenReturn(...);`
Run Code Online (Sandbox Code Playgroud)

在同一测试案例中

when(classA.getString([anything that is not a])).thenReturn(somethingelse);
Run Code Online (Sandbox Code Playgroud)

第二个案例是我的问题:我如何匹配anyString()"a"以外的其他?

tro*_*oig 91

使用Mockito框架,您可以使用AdditionalMatchers

ClassA classA = Mockito.mock(ClassA.class);
Mockito.when(classA.getString(Matchers.eq("a"))).thenReturn("something"); 
Mockito.when(classA.getString(AdditionalMatchers.not(Matchers.eq("a")))).thenReturn("something else");
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.

  • 应该接受这个答案. (9认同)
  • 嗨@PieterDeBie我认为AdditionalMatchers仍然是目前的Mockito版本.[在github项目中查看](https://github.com/mockito/mockito/blob/release/2.x/src/main/java/org/mockito/AdditionalMatchers.java) (2认同)
  • 但这里有一个值得注意的警告。对于所有数字基元,AdditionalMatchers::not 的返回类型为 0,对于布尔基元为 false,对于所有非基元对象 T 为 *null*。这意味着当您尝试在模拟方法上使用它时,您将遇到丑陋的警告,其中参数用@Nonnull注释。 (2认同)

Joh*_*n B 8

argThat与Hamcrest一起使用:

when(classA.getString(argThat(CoreMatchers.not(CoreMatchers.equalTo("a")))...
Run Code Online (Sandbox Code Playgroud)

您也可以通过订购来做到这一点.如果你把一个when(anyString)when(eq("a"))以正确的顺序,应该的Mockito测试他们为了做"一"逻辑在适当的时候再"anyString"逻辑并非如此.


Pie*_*Bie 8

在 mockito 中,最后一个存根是最重要的。这意味着您可以简单地使用标准匹配器来满足您的需求:

// "Default" return values.
when(classA.getString(ArgumentMatchers.anyString())).thenReturn(somethingelse);
// Specific return value for "a"
when(classA.getString(ArgumentMatchers.eq("a"))).thenReturn(something);
Run Code Online (Sandbox Code Playgroud)

请注意,您必须将 ArgumentMatchers 用于两者,因为您正在混合它们。