当前位置: 首页 > 知识库问答 >
问题:

Mockito如何捕获传递给注入的模拟对象的方法的参数?

谢俊悟
2023-03-14

我试图测试一个服务类,它在内部使用Spring AMQP连接对象。此连接对象由Spring注入。然而,我不希望我的单元测试实际与AMQP代理通信,所以我使用Mockito注入连接对象的mock。

/** 
 * 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将模拟依赖项注入到真实类中,并且对真实类的单元测试导致它调用模拟时,您以后如何检索传递给注入的模拟的确切参数?

共有1个答案

於彬
2023-03-14

使用一个或多个,ArgumentCaptors。

现在还不清楚你的类型是什么,但无论如何。假设您有一个mock,它有一个方法doSomething()Foo作为参数,然后执行以下操作:

final ArgumentCaptor<Foo> captor = ArgumentCaptor.forClass(Foo.class);

verify(mock).doSomething(captor.capture());

final Foo argument = captor.getValue();

// Test the argument

此外,您的方法似乎返回void,您不希望它执行任何操作。写下这句话:

doNothing().when(theMock).doSomething(any());
 类似资料:
  • 问题内容: 我正在尝试测试服务类,该服务类在内部使用Spring AMQP连接对象。这个连接对象是由Spring注入的。但是,我不希望单元测试实际上与AMQP代理进行通信,因此我正在使用Mockito注入连接对象的模拟。 希望此代码示例中的注释清楚地提出问题。当Mockito将模拟依赖项注入到真实类中,并且在真实类上进行单元测试导致它调用该模拟对象时,您以后如何才能检索传递给注入的模拟对象的确切参

  • 问题内容: 假设我有一个这样的课: 我想用模拟测试。因此,我创建了一个模拟对象,然后以这种方式调用方法进行测试: 但是,假设我有一个类似的类: 现在我无法将模拟作为参数传递,那么我该如何测试我的方法呢?有人可以举个例子吗? 问题答案: 从根本上讲,您正在尝试用替代实现替换私有字段,这意味着您违反了封装。您唯一的其他选择是重组类或方法,以使其更好地设计用于测试。 评论中有很多简短的答案,因此我在这里

  • 问题内容: 我只是从Groovy开始。我在任何地方都找不到如何处理Groovy脚本参数的示例,因此我自己修改了此方法。必须有更好的方法来做到这一点?如果是这样,我正在寻找这种更好的方法,因为我可能忽略了显而易见的方法。 问题答案: 如果您想要的不仅仅是进阶参数解析,还可以使用Groovy CliBuilder来帮助您。它可以帮助您使用命令行标志,可选参数和打印用法说明。 签出CliBuilder的

  • 标题可能有点混乱或误导,但我试图比较一个字符串: 然后尝试将其与arraylist中包含的每个字符串进行比较 我得到了一个类,唯一重要的是“搜索”方法。 如果您没有注意到,此方法会接收对象的arraylist作为参数。现在的问题是

  • 问题内容: 我正在尝试在RMI方法中添加参数。当我添加例如一切正常。但是我不确定是否可以传递我创建的对象。我是RMI的新手,所以我的代码非常简单: HelloIF 你好 RMI服务器 RMI客户端 最后是我的课堂上下文 我应该怎么做才能使传递上下文成为可能? 问题答案: 您的对象应实现。如我所见,这将是一个问题。之所以需要这样做是因为两个部分之间的通信是使用序列化完成的,因此需要发送给另一部分的每

  • 问题内容: 在java中,可以获取调用当前方法的类和方法(在其中获得StackTrace的方法)。 我的问题是,我可以获取传递给调用此方法的方法的参数吗? 我需要此来进行调试。 例如: 可以从堆栈跟踪中获取此信息,还是有其他方法? (请注意,我需要能够在运行时执行此操作,并且实际上不能更改baseClass的源,这将成为我的调试类的功能,该类事先不知道源) 谢谢。 问题答案: 我认为使用标准Jav