当前位置: 首页 > 知识库问答 >
问题:

在mockito和Junit5测试的同一个类中嘲笑一个void方法?

甄永年
2023-03-14

我想在同一个类中模拟一个void方法,这个方法正在用mockito测试中。我可以用@spy注释not void方法,然后使用下面的代码返回我想要的数据。

        willAnswer(arg -> arg.getArgument(0))
            .given(customerService)
            .saveCustomer(any(Customer.class));
public void deleteCustomersByTenantId(TenantId tenantId) throws ThingsboardException {
    log.trace("Executing deleteCustomersByTenantId, tenantId [{}]", tenantId);
    Validator.validateId(tenantId, "Incorrect tenantId " + tenantId);
    customersByTenantRemover.removeEntities(tenantId, tenantId);
}

public void deleteCustomer(TenantId tenantId, CustomerId customerId) throws ThingsboardException {
    log.trace("Executing deleteCustomer [{}]", customerId);
    Validator.validateId(customerId, INCORRECT_CUSTOMER_ID + customerId);
    Customer customer = findCustomerById(tenantId, customerId);
    if (customer == null) {
        throw new IncorrectParameterException("Unable to delete non-existent customer.");
    }
    entityViewService.unassignCustomerEntityViews(customer.getTenantId(), customerId);
    assetService.unassignCustomerAssets(customer.getTenantId(), customerId);
    userService.deleteCustomerUsers(customer.getTenantId(), customerId);
    deleteEntityRelations(tenantId, customerId);
    entityGroupDao.deleteEntityGroupsByTenantIdAndCustomerId(customer.getTenantId(), customerId);
    customerDao.removeById(tenantId, customerId.getId());
}

private final PaginatedRemover<TenantId, Customer> customersByTenantRemover =
        new PaginatedRemover<>() {

            @Override
            protected PageData<Customer> findEntities(TenantId tenantId, TenantId id, PageLink pageLink) {
                return customerDao.findCustomersByTenantId(id.getId(), pageLink);
            }

            @Override
            protected void removeEntity(TenantId tenantId, Customer entity) throws ThingsboardException {
                deleteCustomer(tenantId, new CustomerId(entity.getUuidId()));
            }
        };
void deleteCustomersByTenantId() throws ThingsboardException {
    //given
    Customer customer = new Customer();
    customer.setId(CUSTOMER_ID);
    customer.setTenantId(TENANT_ID);

    ArgumentCaptor<CustomerId> customerIdArgumentCaptor = ArgumentCaptor.forClass(CustomerId.class);

    var pageData = new PageData<>(Collections.singletonList(customer), 1 ,1 , false);

    given(customerDao.findCustomersByTenantId(any(UUID.class), any(PageLink.class)))
            .willReturn(pageData);
    doNothing()
            .when(customerService)
            .deleteCustomer(any(), any());

    //when
    customerService.deleteCustomersByTenantId(TENANT_ID);

    //then
    then(customerDao)
            .should(times(1))
            .findCustomersByTenantId(any(UUID.class), any(PageLink.class));
    then(customerService)
            .should(times(1))
            .deleteCustomer(any(TenantId.class), customerIdArgumentCaptor.capture());
    assertEquals(CUSTOMER_ID, customerIdArgumentCaptor.getValue());
}
//other mocks...

@Mock
private RelationService relationService;

@Mock
private CustomerValidator customerValidator;

@InjectMocks
@Spy
private CustomerServiceImpl customerService;

每个依赖项都是用@mock模拟的。

共有1个答案

甘君之
2023-03-14

什么都不做对我有用。只要注意呼叫顺序

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;

doNothing().when(yourMock).yourMethod(yourArgs);

这个线程处理一个类似的问题,使用间谍用静态工厂模拟特定的方法应该是可行的。我见过人们做反向操作(在某些特定情况下使用Mock然后调用real方法),但从未亲自尝试过…

 类似资料:
  • 我在Spring测试中使用和来模拟bean: 但是bean的其他方法返回,我如何监视真正创建的bean,而只监视mock方法?

  • 当我试图模仿javax.ws.rs.core 时,我得到一条错误消息: 无法创建JAX-RS运行时委托 为什么会发生这种情况? 但是,当我试图嘲笑HttpServlet响应时,这是没有问题的!

  • 我读到过嘲弄一切是不好的 测试气味:一切都被嘲弄 嘲弄一切是一个好办法 我还读到单元测试关注单个组件,而集成测试则测试整个系统的协同工作<编写优秀的单元测试:最佳和最差实践 这让我困惑。据我所知,要编写一个合适的单元测试,需要通过模拟除SUT之外的所有组件来隔离单个组件。如果在整个测试过程中使用真实对象,那么该测试不是成为一个集成测试吗? 一个人如何编写一个好的(独立的)单元测试而不去嘲笑一切?

  • 运行jUnit时的异常 我想测试这个类,下面是测试方法 运行junit会产生以下异常

  • 在这里,我只想确保抛出异常测试,但希望跳过调用方法在其中。我试着跟着走,但没有奏效

  • 原始关闭原因未解决 有人告诉我@Mock通常只用于单元测试,但我认为它对于替换测试类之外的外部部分很有用。在集成测试中模拟是正确的吗?