Junit 和 Mockito,捕获传递参数的方法调用

Junit And Mockito, Capturing method call on passed argument

我对 Java 中的 Mockito 和 Junit 比较陌生。我如何捕获或验证传递给我正在测试的函数的参数的交互。 Ex-- 主要 class

public class A{

 public void setValues(Person p){
  p.setFirstName('Lucky');
  p.setLastName('Singh');

// Some more code
 }
}

测试class

class Test {

@InjectMocks
A classUnderTest;

@Test 
public void tests(){
  classUnderTest.setValues(new Person());
// What to do next to verfiy that the setFirstName and setLastName where really called on Person Object as setValues have void return type??
}
}

现在我想用 void return 类型测试这个 setValues 方法。 我知道如果 return 类型是 Person 我可以使用 assert .但是我不能改变方法定义。 所以我想验证是否调用了 setFirstName 和 setlastName。
我正在使用坑测试,并且删除了对 setFirstName 和 setlastName 的调用的突变没有被杀死。
我怎样才能做到这一点??

您可以为您的 Person class 注入间谍,然后验证是否按如下方式调用方法:

class Test {
  @Spy
  Person person = new Person();

  @InjectMocks
  A classUnderTest;

  @Test 
  public void tests(){
    classUnderTest.setValues(person);

    // You can now verify if the methods setFirstName and setLastName where really called on Person
    verify(person, times(1)).setFirstName(isA(String.class));
    verify(person, times(1)).setLastName(isA(String.class));
  }
}

间谍将包装现有实例,在您的情况下 Person。它仍将以与普通实例相同的方式运行,唯一的区别是它还将被检测以跟踪与其进行的所有交互,以便您可以实际验证所调用的方法。