【问题标题】:Mockito - nested method invoked multiple timesMockito - 多次调用的嵌套方法
【发布时间】:2021-04-13 12:19:15
【问题描述】:

我有一个服务类,它调用 ie 的方法。 repository.save() 多次。我正在测试所说的服务方法。是否可以在x 时间捕获save() 方法调用并获取其传递/返回的参数?

例子:

class MyService{

    void doSomething(){
        myRepository.save(obj1);
        // some code;
        myRepository.save(obj2);
    }

}

我正在测试doSomething 方法并希望获得第一个保存方法的结果和/或传递的参数。我正在使用 mockito。

【问题讨论】:

    标签: java spring-boot mockito


    【解决方案1】:

    与上一个答案类似,我假设myRepository 的类型为MyRepository,被模拟并传递给myService。您可以使用ArgumentCaptor 捕获并检查传递给方法save() 的参数:

        @Test
        public void testDoSomething() {
    
            // Given
            MyRepository myRepository = Mockito.mock(MyRepository.class);
            MyService myService = new MyService(myRepository);
    
            // When
            myService.doSomething();
    
            // Then
            ArgumentCaptor<Object> captor = ArgumentCaptor.forClass(Object.class);
            Mockito.verify(myRepository, Mockito.times(2)).save(captor.capture());
    
            Assert.assertEquals(obj1, captor.getAllValues().get(0)); // First invocation of save()
            Assert.assertEquals(obj2, captor.getAllValues().get(1)); // Second invocation of save()
        }
    

    【讨论】:

      【解决方案2】:

      我假设您将 myRepository 作为依赖项传递给 MyService。在这种情况下,您可以在测试中创建它的模拟,然后通过该模拟。

      您可以调用Mockito.doAnswer(...).when(myRepository).save(any()) 并传递一个Answer 来处理您模拟的myRepositorysave 调用。如果需要执行myRepository对象的实际方法,可以在链中添加doCallRealMethod()

      传递给Answer 的参数是调用,您可以使用invocation.getArguments() 获取参数。

      更新:@Benoit 的回答似乎更加优雅,因为 ArgumentCaptor 不需要额外的逻辑来确定它是第一次还是第二次调用。

      【讨论】:

      • 我还是不明白如何获得第一个方法调用?我处理了when(myRepo.save()).return(...),但我想检查传递给第一个repo.save 方法调用的对象。我对第一个之后的其他相同方法调用不感兴趣,也对测试与我的 doSomething 方法分离的特定方法不感兴趣。
      • @Aline137 您必须使用 answer 方法中的逻辑来决定是第一次调用还是第二次调用。例如,您可以切换一个布尔值(第一次调用为 true,第二次调用为 false) - 假设您只在 MyService 内调用 save
      猜你喜欢
      • 2017-06-03
      • 2012-11-08
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      相关资源
      最近更新 更多