Mockito:如何模拟具有特定属性值的对象

Cra*_*hax 3 java mockito

假设我们有以下类:

class Person { 

private int age;
private String name;

public Person(int age, String name){
   this.age = age;
   this.name = name;
}

// getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我们还有一些课程:

class SpecialClass {

   public int giveNumber(Person p) { 
   ...
   return (int)(...)
   }
}
Run Code Online (Sandbox Code Playgroud)

假设我想模拟一个 SpecialClass 的对象,如果使用 name 属性等于 'John' 的 Person 对象调用 'giveNumber',那么 'giveNumber' 将检索 500。

例如,

SpecialClass sc = mock(SpecialClass.class);
when(sc.giveNumber(p with name = "John").thenReturn(500);
Run Code Online (Sandbox Code Playgroud)

有没有办法用 Mockito 做到这一点?

Ben*_*rdt 6

您可以使用org.mockito.ArgumentMatchers.argThat(...)向它传递一个与所需实例匹配的 lambda。在这种情况下,lamdba 将类似于

(person) -> "John".equals(person.getName())
Run Code Online (Sandbox Code Playgroud)

把它放在一起:

SpecialClass sc = mock(SpecialClass.class);
when(sc.giveNumber(argThat((person) -> "John".equals(person.getName())))).thenReturn(500);
Run Code Online (Sandbox Code Playgroud)