【问题标题】:How to write a unit test for method that creates an object inside of it and passes it to mocked object?如何为在其中创建对象并将其传递给模拟对象的方法编写单元测试?
【发布时间】:2021-10-14 17:29:18
【问题描述】:

这是我想测试的方法,certificateRepository 看到一个模拟,QueryFiltersConfig config 是我传递给该模拟方法的对象。我使用 JUnit 5 作为测试框架。

@Override
public List<GiftCertificateDto> fetchCertificatesWithFilters(Optional<String> tagName, Optional<List<String>> sortTypes, Optional<String> searchPattern) {
        QueryFiltersConfig.Builder filterConfigBuilder = QueryFiltersConfig.builder();
        tagName.ifPresent(filterConfigBuilder::withTag);
        addSortsToConfig(sortTypes, filterConfigBuilder);
        searchPattern.ifPresent(filterConfigBuilder::withSearchPattern);
        QueryFiltersConfig config = filterConfigBuilder.build();
        return certificateRepository.findWithFilters(config).stream()
                .map(dtoTranslator::giftCertificateToDto).collect(Collectors.toList());
}

在这种情况下,我该如何编写模拟初始化(Mockito.when(...) 语句)?或者也许我应该反过来做?如果是这样 - 如何?

【问题讨论】:

  • “模拟初始化”具体是什么意思?通常你只说var mockCr = mock(CertificateRepository.class)new GiftCertificateService(mockCr)
  • 我指的是写Mockito.when(...)语句
  • 您的certificateRepository 字段是如何设置的?你用任何 DI 框架注入它吗?
  • 不,我用@InjectMocks注解
  • @Felipe 回答完成了这项工作。但我在我的情况下找到了更合适的方法。因为我没有测试与QueryFiltersConfig 相关的逻辑,所以我在findWithFilters() 方法上使用了Mockito.any()

标签: java unit-testing junit mocking mockito


【解决方案1】:

使用ArgumentCaptor,它允许您捕获传递给方法的参数以便检查它。当您无法访问我们要测试的方法之外的参数时,这尤其有用。 Here is a good reference.

让我试着根据你的方法举一个例子。我假设您有一个名为YourService 的服务,您可以使用@InjectMocks 注释来注入模拟的CertificateRepository

  1. 然后您使用QueryFiltersConfig 类型的@Captor ArgumentCaptor 字段来存储我们捕获的参数。

  2. Mockito.verify 使用 ArgumentCaptor 捕获 QueryFiltersConfig 并使用 configCaptor.getValue() 捕获参数

  3. 使用断言检查捕获的值。

@RunWith(MockitoJUnitRunner.class)
public class CertificateRepositoryTest {
    @Mock
    CertificateRepository certificateRepository;
    @InjectMocks
    YourService yourService;
    // 1
    @Captor
    ArgumentCaptor<QueryFiltersConfig> configCaptor;

    @Test
    public void testWithCaptor() {
        // 2 - call your service and let it do whatever it needs
        // with the parameter passed to it
        yourService.fetchCertificatesWithFilters(parameters);

        // 2 - capture the object created inside your service
        Mockito.verify(certificateRepository)
              .findWithFilters(configCaptor.capture());
        QueryFiltersConfig value = configCaptor.getValue();
        // 3 - and make sure that the value is correct
        assertEquals(expectedValue, value);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2018-05-23
    • 2021-09-26
    相关资源
    最近更新 更多