使用局部变量作为参数的模拟内部方法

我最近开始使用Mockito 3 + Junit 5 + Spring 5,并且正在编写一些示例测试,以了解Mockito的工作方式。我对内部电话有疑问。因此,我有一个弹簧组件A,其中注入了一些DAO组件someObjectDAOA类:

@Component("aClass")
public class A {
   @Autowired
   private ObjectDAO someObjectDAO;

   public Long countRecords() {
       ObjectSearchCriteria search = new ObjectSearchCriteria();
       return someObjectDAO.count(search);
   }
}

我想测试A的{​​{1}}方法。我已经像这样嘲笑并注入了countRecords

someObjectDAO

但是这种方式是不正确的,实际上是引发了@ExtendWith(MockitoExtension.class) @ContextConfiguration("contextConfFileSomewhere") public class ATest { @Mock ObjectDAO someObjectDAOMock; @InjectMocks A aComponent; @Test void testCount() { ObjectSearchCriteria search = Mockito.mock(ObjectSearchCriteria.class); Mockito.when(someObjectDAOMock.count(search)).thenReturn(1L); Assertion.assertEquals(1L,aComponent.countRecords()); } }

PotentialStubbingProblem

如果我正确理解异常,则表明我正在传递的对象与测试代码中使用的实际对象不同,对吗?

那么,我该如何模拟使用局部变量作为参数的内部方法?

format_88 回答:使用局部变量作为参数的模拟内部方法

您要模拟对具有参数的ObjectDAO.count的调用。与其传递期望参数的实例作为参数,不如使用参数匹配器:

 Mockito.when(someObjectDAOMock.count(Mockito.any(ObjectSearchCriteria.class)))
    .thenReturn(1L);

编辑:您可能甚至应该永远都不想“模拟局部变量”。您的目标是在不了解实现细节的情况下测试被测系统(countRecords方法)。您所能做的就是模拟依赖关系。

本文链接:https://www.f2er.com/3139075.html

大家都在问