How can Mockito capture arguments passed to an injected mock object#39;s methods?(Mockito 如何捕获传递给注入的模拟对象方法的参数?)
问题描述
我正在尝试测试一个内部使用 Spring AMQP 连接对象的服务类.这个连接对象是由 Spring 注入的.但是,我不希望我的单元测试实际与 AMQP 代理通信,所以我使用 Mockito 注入连接对象的模拟.
I am trying to test a service class, which internally makes use of a Spring AMQP connection object. This connection object is injected by Spring. However, I don't want my unit test to actually communicate with the AMQP broker, so I am using Mockito inject a mock of the connection object.
/**
* The real service class being tested. Has an injected dependency.
*/
public class UserService {
@Autowired
private AmqpTemplate amqpTemplate;
public final String doSomething(final String inputString) {
final String requestId = UUID.randomUUID().toString();
final Message message = ...;
amqpTemplate.send(requestId, message);
return requestId;
}
}
/**
* Unit test
*/
public class UserServiceTest {
/** This is the class whose real code I want to test */
@InjectMocks
private UserService userService;
/** This is a dependency of the real class, that I wish to override with a mock */
@Mock
private AmqpTemplate amqpTemplateMock;
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testDoSomething() {
doNothing().when(amqpTemplateMock).send(anyString(), any(Message.class));
// Call the real service class method, which internally will make
// use of the mock (I've verified that this works right).
userService.doSomething(...);
// Okay, now I need to verify that UUID string returned by
// "userService.doSomething(...) matches the argument that method
// internally passed to "amqpTemplateMock.send(...)". Up here
// at the unit test level, how can I capture the arguments passed
// to that inject mock for comparison?
//
// Since the value being compared is a UUID string created
// internally within "userService", I cannot just verify against
// a fixed expected value. The UUID will by definition always be
// unique.
}
}
此代码示例中的注释有望清楚地说明问题.当 Mockito 将模拟依赖注入到真实类中,并且对真实类的单元测试导致它调用模拟时,您以后如何检索传递给注入模拟的确切参数?
The comments in this code sample hopefully lay out the question clearly. When Mockito injects a mock dependency into a real class, and unit tests on the real class cause it to make calls to the mock, how can you later retrieve the exact arguments that were passed to the injected mock?
推荐答案
使用一个或多个 ArgumentCaptor
s.
目前尚不清楚您的类型在这里,但无论如何.假设你有一个 mock,它有一个方法 doSomething()
以 Foo
作为参数,然后你这样做:
It is unclear what your types are here, but anyway. Let's suppose you have a mock which has a method doSomething()
taking a Foo
as an argument, then you do this:
final ArgumentCaptor<Foo> captor = ArgumentCaptor.forClass(Foo.class);
verify(mock).doSomething(captor.capture());
final Foo argument = captor.getValue();
// Test the argument
此外,您的方法似乎返回 void 并且您不希望它执行任何操作.就这样写吧:
Also, it looks like your method returns void and you don't want it to do anything. Just write this:
doNothing().when(theMock).doSomething(any());
这篇关于Mockito 如何捕获传递给注入的模拟对象方法的参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Mockito 如何捕获传递给注入的模拟对象方法的参数?


- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
- Eclipse 插件更新错误日志在哪里? 2022-01-01
- C++ 和 Java 进程之间的共享内存 2022-01-01
- 将log4j 1.2配置转换为log4j 2配置 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- Jersey REST 客户端:发布多部分数据 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01
- Java包名称中单词分隔符的约定是什么? 2022-01-01
- 如何使用WebFilter实现授权头检查 2022-01-01