我有一项服务看起来像这样的服务 -
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);
}