使用不同的类参数调用相同方法的摩索通



我有一项服务看起来像这样的服务 -

class ServiceClass {
    @Inject
    EventService event;
    public void handleUser(User user) throws ServiceClassException {
        Customer customer = userToCustomer(user);
        CustomerDetail detail = userToCustomerDetail(user);
        try {
            Response response1 = event.generateEvent(customer);
        } catch(Exception e) {
            throw new ServiceClassException();
        }
        try {
            Response response2 = event.generateEvent(detail);
        } catch(Exception e) {
            throw new ServiceClassException();
        } 
    }
    private Customer userToCustomer(User user) {
        // Some logic
    }
    private CustomerDetail userToCustomerDetail(User user) {
        // Some logic
    }
}

现在编写测试时,我想检查异常处理。这就是我的测试案例的样子。

class ServiceClassTest {
    @InjectMocks
    ServiceClass service;
    @Mock
    EventService event;
    @Before
    public void setUp() {
        User user = new User();
        user.setValue("fsfw");
    }
    @Test
    public void handleUserThrowsException() throws Exception {
        Mockito.when(event.generateEvent(Mockito.any(Customer.class))).thenThrow(new RuntimeException());
        try {
            Response response1 = service.handleUser(user);
        } catch(ServiceClassException e) {}
        Mockito.verify(event, Mockito.never()).generateEvent(Mockito.any(CustomerDetail.class));
    }
}

上面的测试案例失败了,消息在这里从未想过:

由于两者都是类型any,因此无法区分哪种方法不应执行。

我尝试了不同的变体,例如更换行 - Mockito.when(event.generateEvent(Mockito.any(Customer.class))).thenThrow(new RuntimeException());

Mockito.when(event.generateEvent(Customer.class)).thenThrow(new RuntimeException());

但是它不起作用,因为Customer对象是handleUser方法中创建的东西,因此两个实例都不同,并且没有抛出我在测试中设置的异常。

与,

相似
Customer customer = new Customer;
customer.setValue("fsfw");
Mockito.when(event.generateEvent(customer)).thenThrow(new RuntimeException());

再次,由于两个客户实例都不同,因此没有提出异常,因为它应该根据测试设置。

你们中的任何人都可以建议如何测试这个吗?编写这样的测试案例,但我不知道这是否是正确的方法 -

@Test
public void handleUserThrowsException() throws Exception {
    Mockito.when(event.generateEvent(Mockito.any(Customer.class))).thenThrow(new RuntimeException());
    try {
        Response response1 = service.handleUser(user);
    } catch(ServiceClassException e) {}
    Mockito.verify(event, Mockito.never()).generateEvent(CustomerDetail.class);
}

请让我知道正确的测试方法?

这里有两个想法:

  • 真的是强制性 verifie 那些非相互作用吗?换句话说:完全对验证该方面真的有帮助吗?
  • 何时发生这种情况:为什么要专注于 special 案例?

换句话说:

  • 预期调用创建模拟规格
  • 改用模拟上的verifyNoMoreInteractions(请参阅此处以获取进一步阅读)。

so:指定所有预期的呼叫,并验证没有任何其他情况。给您相同的结果,易于写下,易于理解。

感谢@ghostcat的答案,只想添加我用来验证此测试方案的这两行代码 -

    @Test
    public void handleUserThrowsException() throws Exception {
        Mockito.when(event.generateEvent(Mockito.any())).thenThrow(new RuntimeException());
        try {
            Response response1 = service.handleUser(user);
        } catch(ServiceClassException e) {}
        Mockito.verify(event, Mockito.times(1)).generateEvent(Mockito.any());
        Mockito.verifyNoMoreInteractions(event);
    }

相关内容

  • 没有找到相关文章

最新更新