Mockito – 验证一个方法被调用了两次,分别使用了两个不同的参数。

huangapple go评论94阅读模式
英文:

Mockito - Verify a method is called twice with two different params

问题

Sure, here is the translation of the provided content:

我必须验证以下方法的行为:

  1. public void saveRequestAndResponse(request, response, additionalInfo) {
  2. // 对 additionalInfo 进行一些处理
  3. dao.save(request);
  4. dao.save(response);
  5. }

在我的测试类中:

  1. ArgumentCaptor<com.ws.Request> request = ArgumentCaptor.forClass(com.ws.Request.class);
  2. Mockito.verify(dao, Mockito.times(1)).save(request.capture());
  3. ArgumentCaptor<com.ws.Response> response = ArgumentCaptor.forClass(com.ws.Response.class);
  4. Mockito.verify(dao, Mockito.times(1)).save(response.capture());

以及 DAO 方法:

  1. @Transactional
  2. public <T> T save(final T it) {
  3. saveOrUpdate(it);
  4. }

收到的错误:

  1. org.mockito.exceptions.verification.TooManyActualInvocations:
  2. dao.save(<Capturing argument>);
  3. Wanted 1 time:
  4. -> at com.ws.testclass(TestClass.java:296)
  5. But was 2 times:
  6. -> at com.ws.mainclass.lambda$saveRequestAndResponse$78(MainClass.java:200)
  7. -> at com.ws.mainclass.saveRequestAndResponse(MainClass.java:205)

我的 DAO 类中的 save() 方法使用了类型参数 T。

我如何验证对 dao.save(type) 方法的两次调用,这两次调用使用了不同的类型,比如 Request 和 Response?

英文:

I have to verify the behavior on the following method:

  1. public void saveRequestAndResponse(request, response, additionalInfo) {
  2. // some processing with additionalInfo
  3. dao.save(request);
  4. dao.save(response);
  5. }

In my test class:

  1. ArgumentCaptor&lt;com.ws.Request&gt; request = ArgumentCaptor.forClass(com.ws.Request.class);
  2. Mockito.verify(dao, Mockito.times(1)).save(request.capture());
  3. ArgumentCaptor&lt;com.ws.Response&gt; response = ArgumentCaptor.forClass(com.ws.Response.class);
  4. Mockito.verify(dao, Mockito.times(1)).save(response.capture());

And the DAO method:

  1. @Transactional
  2. Public &lt;T&gt; T save(final T it) {
  3. saveOrUpdate(it);
  4. }

Error received:

  1. org.mockito.exceptions.verification.TooManyActualInvocations:
  2. dao.save(&lt;Capturing argument&gt;);
  3. Wanted 1 time:
  4. -&gt; at com.ws.testclass(TestClass.java:296)
  5. But was 2 times:
  6. -&gt; at com.ws.mainclass.lambda$saveRequestAndResponse$78(MainClass.java:200)
  7. -&gt; at com.ws.mainclass.saveRequestAndResponse(MainClass.java:205)

The save() method in my DAO class uses the type parameter T.

How do I verify two invocations on dao.save(type) method with two different types such as Request and Response?

答案1

得分: 3

你可以使用类似这样的代码:

  1. ArgumentCaptor<Object> parameters = ArgumentCaptor.forClass(Object.class);
  2. Mockito.verify(dao, Mockito.times(2)).save(parameters.capture());
  3. List<Object> values = parameters.getAllValues();
  4. com.ws.Request req = (com.ws.Request) values.get(0);
  5. com.ws.Response res = (com.ws.Response) values.get(1);
  6. // 验证部分
英文:

You can use something like this:

  1. ArgumentCaptor&lt;Object&gt; parameters = ArgumentCaptor.forClass(Object.class);
  2. Mockito.verify(dao, Mockito.times(2)).save(parameters.capture());
  3. List&lt;Object&gt; values= parameters.getAllValues();
  4. com.ws.Request req= (com.ws.Request) values.get(0);
  5. com.ws.Response res= (com.ws.Respons) values.get(1);
  6. //Validations

答案2

得分: 1

你想要的是有序验证。根据文档:

  1. // A. 需要按特定顺序调用方法的单个模拟对象
  2. List singleMock = mock(List.class);
  3. // 使用单个模拟对象
  4. singleMock.add("首先添加");
  5. singleMock.add("其次添加");
  6. // 为单个模拟对象创建有序验证器
  7. InOrder inOrder = inOrder(singleMock);
  8. // 以下代码将确保首先使用"首先添加"调用 add 方法,然后使用"其次添加"调用 add 方法
  9. inOrder.verify(singleMock).add("首先添加");
  10. inOrder.verify(singleMock).add("其次添加");
英文:

What you want is in order verification. From the documentation:

  1. // A. Single mock whose methods must be invoked in a particular order
  2. List singleMock = mock(List.class);
  3. //using a single mock
  4. singleMock.add(&quot;was added first&quot;);
  5. singleMock.add(&quot;was added second&quot;);
  6. //create an inOrder verifier for a single mock
  7. InOrder inOrder = inOrder(singleMock);
  8. //following will make sure that add is first called with &quot;was added first, then with &quot;was added second&quot;
  9. inOrder.verify(singleMock).add(&quot;was added first&quot;);
  10. inOrder.verify(singleMock).add(&quot;was added second&quot;);

huangapple
  • 本文由 发表于 2020年9月5日 06:43:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/63748791.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定