Mockito return 特定对象的值,并为所有其他相同类型的对象抛出
Mockito return value for specific objects and throw for all other object of same type
我有以下代码:
private SaveTransactionClient mockedTransactionClient;
private static Publisher publisher;
private static MyDTO mDTO1;
private static MyDTO mDTO2;
private static MyDTO mDTO3;
@BeforeClass
public void setUp() throws IOException {
TransactionResponse successResponse = new TransactionResponse();
successResponse.setDateRequest("2016-04-27 18:47:50");
successResponse.setResponse("OK");
successResponse.setTransactionNumber("1");
TransactionResponse failedResponse = new TransactionResponse();
failedResponse.setDateRequest("2016-04-27 18:47:50");
failedResponse.setResponse("Dublicate Transaction Error");
failedResponse.setTransactionNumber("1");
mDTO1 = new MyDTO(1, LocalDateTime.now(), 0);
mDTO2 = new MyDTO(2, LocalDateTime.now(), 0);
mDTO3 = new MyDTO(3, LocalDateTime.now(), 0);
mockedTransactionClient = mock(SaveTransactionClient.class);
when(mockedTransactionClient.sendTransactionRequest(mDTO1)).thenReturn(successResponse);
when(mockedTransactionClient.sendTransactionRequest(mDTO2)).thenReturn(failedResponse);
when(mockedTransactionClient.sendTransactionRequest(mDTO3)).thenThrow(new IOException());
when(mockedTransactionClient.sendTransactionRequest(any(MDTO.class))).thenThrow(new IOException());
publisher = new publisherImpl(mockedTransactionClient);
}
实际测试是
@Test
public void TestOnlyExceptionalPublishing() {
BlockingQueue<MDTO> mDTOs = new LinkedBlockingQueue<>(Arrays.asList(mDTO3));
assertEquals(mDTOs.size(), 1);
List<MDTO> successful = publisher.publish(wDTOs);
assertEquals(successful.size(), 0);
}
@Test
public void TestOneSuccessContainsExceptionalPublishing() {
BlockingQueue<MDTO> mDTOs = new LinkedBlockingQueue<>(Arrays.asList(mDTO3,mDTO1, mDTO2));
assertEquals(mDTOs.size(), 3);
List<MDTO> successful = publisher.publish(mDTOs);
assertEquals(successful.size(), 1);
}
现在 MDTO
是不可变的,publisher.publish(mDTO)
的工作方式是 Exception 在 [=13] 中增加一个 "retries" 计数器=] 并最多重试 3 次。当计数器递增时,会生成一个新的 MDTO
,响应 not 被 Mockito 存根,这对我来说是个问题。我添加了 any
但这会使其他测试失败,因为它抛出所有对象而不是任何其他对象,除了我已经提供的对象。
在 Mockito 中是否有任何 anyOther 类型的方法可以做到这一点?
我认为(如果我理解正确的话)您正在寻找 doAnswer
/thenAnswer
:
when(mockedTransactionClient.sendTransactionRequest(any(MyDTO.class)).thenAnswer(new Answer<TransactionResponse>() {
@Override
public TransactionResponse answer(final InvocationOnMock invocation) {
final MyDTO arg = invocation.getArgumentAt(0, MyDTO.class)
// do stuff here based on arg
return someTransactionResponse; // or throw some exception
}
});
我有以下代码:
private SaveTransactionClient mockedTransactionClient;
private static Publisher publisher;
private static MyDTO mDTO1;
private static MyDTO mDTO2;
private static MyDTO mDTO3;
@BeforeClass
public void setUp() throws IOException {
TransactionResponse successResponse = new TransactionResponse();
successResponse.setDateRequest("2016-04-27 18:47:50");
successResponse.setResponse("OK");
successResponse.setTransactionNumber("1");
TransactionResponse failedResponse = new TransactionResponse();
failedResponse.setDateRequest("2016-04-27 18:47:50");
failedResponse.setResponse("Dublicate Transaction Error");
failedResponse.setTransactionNumber("1");
mDTO1 = new MyDTO(1, LocalDateTime.now(), 0);
mDTO2 = new MyDTO(2, LocalDateTime.now(), 0);
mDTO3 = new MyDTO(3, LocalDateTime.now(), 0);
mockedTransactionClient = mock(SaveTransactionClient.class);
when(mockedTransactionClient.sendTransactionRequest(mDTO1)).thenReturn(successResponse);
when(mockedTransactionClient.sendTransactionRequest(mDTO2)).thenReturn(failedResponse);
when(mockedTransactionClient.sendTransactionRequest(mDTO3)).thenThrow(new IOException());
when(mockedTransactionClient.sendTransactionRequest(any(MDTO.class))).thenThrow(new IOException());
publisher = new publisherImpl(mockedTransactionClient);
}
实际测试是
@Test
public void TestOnlyExceptionalPublishing() {
BlockingQueue<MDTO> mDTOs = new LinkedBlockingQueue<>(Arrays.asList(mDTO3));
assertEquals(mDTOs.size(), 1);
List<MDTO> successful = publisher.publish(wDTOs);
assertEquals(successful.size(), 0);
}
@Test
public void TestOneSuccessContainsExceptionalPublishing() {
BlockingQueue<MDTO> mDTOs = new LinkedBlockingQueue<>(Arrays.asList(mDTO3,mDTO1, mDTO2));
assertEquals(mDTOs.size(), 3);
List<MDTO> successful = publisher.publish(mDTOs);
assertEquals(successful.size(), 1);
}
现在 MDTO
是不可变的,publisher.publish(mDTO)
的工作方式是 Exception 在 [=13] 中增加一个 "retries" 计数器=] 并最多重试 3 次。当计数器递增时,会生成一个新的 MDTO
,响应 not 被 Mockito 存根,这对我来说是个问题。我添加了 any
但这会使其他测试失败,因为它抛出所有对象而不是任何其他对象,除了我已经提供的对象。
在 Mockito 中是否有任何 anyOther 类型的方法可以做到这一点?
我认为(如果我理解正确的话)您正在寻找 doAnswer
/thenAnswer
:
when(mockedTransactionClient.sendTransactionRequest(any(MyDTO.class)).thenAnswer(new Answer<TransactionResponse>() {
@Override
public TransactionResponse answer(final InvocationOnMock invocation) {
final MyDTO arg = invocation.getArgumentAt(0, MyDTO.class)
// do stuff here based on arg
return someTransactionResponse; // or throw some exception
}
});