我有一个需要测试的类A
。以下是A
的定义:
public class A {
private Human human = new Human();
private SuperService service;
public void methodOne() {
service.processFile(human);
}
}
在我的测试中,我想做这样的事情:
verify(service, times(1)).processFile(new Human());
当然,由于:
,我会失败Argument(s) are different! Wanted:
Human$1@60cf80e7
Actual invocation has different arguments:
Human@302fec27
我需要的是将human
属性设置为在测试时将其设置为某些特定值。有什么方法可以使用Mockito?
假设service
是注射
public class A {
private Human human = new Human();
private SuperService service;
public A(SuperService service) {
this.service = service;
}
public void methodOne() {
service.processFile(human);
}
}
并已适当地模拟了测试
SuperService service = mock(SuperService.class);
//...
验证所需的行为
时,您可以使用参数匹配器verify(service, times(1)).processFile(any(Human.class));
Mockito应该使用equals()
方法比较参数。
看来您尚未在Human
类中实现Human.equals(Object other)
,因此它正在使用对象引用进行比较,这不是您想要的。
最简单的修复可能是在Human
类中实现equals()
(和hashCode()
(。然后,您可以通过您期望的属性传递new Human()
。当然,您必须与具有相同属性的人匹配,因此实际上更像是verify(service, times(1)).processFile(new Human("John", "Smith"));
另外,只需使用用户7所建议的any(Human.class)
即可。这将断言该类匹配,但不会在课堂内的任何字段上断言。也就是说,您会知道processFile()
被称为 some 人,但是您不知道它是用名为John Smith的Human
调用的,还是名为Jane Doe的Human
。
第三个解决方案是使用参数绑架者捕获所调用的人类类。然后,您可以在关心的领域中单独断言。例如,
ArgumentCaptor<Human> argument = ArgumentCaptor.forClass(Human.class);
verify(service, times(1)).processFile(argument.capture());
assertEquals("John", argument.getValue().getName());