使用Mockito模拟类的本地变量



我有一个需要测试的类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());

相关内容

  • 没有找到相关文章

最新更新