保存被 Mockito 侦测到的信息
Save information that was spied by Mockito
我有一个 JUnit 测试:
@Spy
ParallelSender parallelSender = new ParallelSender();
@Test
public void send() {
// making some data...
parallelSender.send(someData);
// check that internal method has been called with Sender Task made from someData
verify(parallelSender).doSend(any(SenderTask.class));
}
不过,我想检查 SenderTask 是否包含我需要的所有字段。我可以告诉间谍拦截 doSend 调用,将其参数存储在某个数组中,然后继续使用真正的方法吗?
您可以使用 ArgumentCaptor
.
@Captor
ArgumentCaptor<SenderTask> captor;
// or ArgumentCaptor<SenderTask> captor =
// ArgumentCaptor.forClass(SenderTask.class);
@Test public void send() {
// ...
verify(parallelSender).doSend(captor.capture());
SenderTask captured = captor.getValue();
使用ArgumentCaptor
:
@Test
public void send() {
// making some data...
parallelSender.send(someData);
// Define the captor for class
ArgumentCaptor<SenderTask> captor =
ArgumentCaptor.forClass(SenderTask.class);
// Capture input while verifying
verify(parallelSender).doSend(captor.capture());
// Assert
SomeTask result = captor.getValue();
// assertions on result
}
我很少使用参数捕获器,因为通常没有必要。
就这样做
@Test
public void send() {
//given
SomeData myInput = ...
SenderTask expectedOutput = new SenderTask();
expectedOutput.setSomeField(/*expected field value*/);
//when
parallelSender.send(myInput);
//then
verify(parallelSender).doSend(expectedOutput);
}
背后的想法是检查 "doSend" 是否使用预期对象调用。
注意:只需确保您在 SenderTask 中实现了 equals/hash 方法 - 否则它将不起作用
注意 2:我建议避免在单元测试中使用 any() 。通常当你对某些东西进行单元测试时——你希望尽可能精确。所以在结果验证时使用具体的对象。
希望对你有帮助
我有一个 JUnit 测试:
@Spy
ParallelSender parallelSender = new ParallelSender();
@Test
public void send() {
// making some data...
parallelSender.send(someData);
// check that internal method has been called with Sender Task made from someData
verify(parallelSender).doSend(any(SenderTask.class));
}
不过,我想检查 SenderTask 是否包含我需要的所有字段。我可以告诉间谍拦截 doSend 调用,将其参数存储在某个数组中,然后继续使用真正的方法吗?
您可以使用 ArgumentCaptor
.
@Captor
ArgumentCaptor<SenderTask> captor;
// or ArgumentCaptor<SenderTask> captor =
// ArgumentCaptor.forClass(SenderTask.class);
@Test public void send() {
// ...
verify(parallelSender).doSend(captor.capture());
SenderTask captured = captor.getValue();
使用ArgumentCaptor
:
@Test
public void send() {
// making some data...
parallelSender.send(someData);
// Define the captor for class
ArgumentCaptor<SenderTask> captor =
ArgumentCaptor.forClass(SenderTask.class);
// Capture input while verifying
verify(parallelSender).doSend(captor.capture());
// Assert
SomeTask result = captor.getValue();
// assertions on result
}
我很少使用参数捕获器,因为通常没有必要。 就这样做
@Test
public void send() {
//given
SomeData myInput = ...
SenderTask expectedOutput = new SenderTask();
expectedOutput.setSomeField(/*expected field value*/);
//when
parallelSender.send(myInput);
//then
verify(parallelSender).doSend(expectedOutput);
}
背后的想法是检查 "doSend" 是否使用预期对象调用。
注意:只需确保您在 SenderTask 中实现了 equals/hash 方法 - 否则它将不起作用
注意 2:我建议避免在单元测试中使用 any() 。通常当你对某些东西进行单元测试时——你希望尽可能精确。所以在结果验证时使用具体的对象。
希望对你有帮助