莫基托。验证方法参数 argThat加上λ argThat加断言直接参数 eq匹配器 argThat具有多个参数。

2022-08-31 04:56:11

我已经谷歌了这个,但没有找到任何相关的东西。我有这样的东西:

Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj )).thenReturn(null);

Testeable testableObj = new Testeable();
testableObj.setMockeable(mock);
command.runtestmethod();

现在,我想验证 ,在内部调用,是用对象调用的,而不是任何其他对象。但我总是通过测试,无论我在验证上放了什么,例如,mymethod(Object o)runtestmethod()o

Mockito.verify(mock.mymethod(Mockito.eq(obj)));

Mockito.verify(mock.mymethod(Mockito.eq(null)));

Mockito.verify(mock.mymethod(Mockito.eq("something_else")));

我总是通过测试。如何完成该验证(如果可能)?

谢谢。


答案 1

另一种方法是 ArgumentCaptorArgumentMatcher

官方示例:

ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class);
verify(mock).doSomething(argument.capture());
assertEquals("John", argument.getValue().getName());

也可以使用@Captor注释来定义捕获器:

@Captor ArgumentCaptor<Person> captor;
//... MockitoAnnotations.initMocks(this);
@Test public void test() {
    //...
    verify(mock).doSomething(captor.capture());
    assertEquals("John", captor.getValue().getName());
}

答案 2

argThat加上λ

这就是你如何失败你的参数验证:

    verify(mock).mymethod(argThat(
                            x -> false ));

哪里

import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;

argThat加断言

上面的测试会“说”。如果在 lambda 中使用断言,则可以获取更具体的失败原因:Expected: lambda$... Was: YourClass.toSting...

    verify(mock).mymethod(argThat( x -> {
      assertThat(x).isNotNull();
      assertThat(x.description).contains("KEY");
      return true;
    }));

❗️但是❗️:这仅适用于以下情况

  • 呼叫应为 1 次,或者
  • 调用应为 2 次以上,但验证程序的所有次数都匹配(返回 true)。

如果验证的方法调用了 2 次以上,mockito 会将所有调用的组合传递给每个验证器。因此,mockito 期望您的验证器静默地为其中一个参数集返回 true,为其他有效调用返回 false(无断言异常)。对于 1 个方法调用来说,这种期望不是问题 - 它应该只返回 true 1 次。

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;

现在,失败的测试将显示:。注意:我使用了断言,但由您决定使用哪个断言框架。Expected: Obj.description to contain 'KEY'. Was: 'Actual description'assertJ


直接参数

Mokito使用以下方法比较直接参数:equals()

verify(mock).mymethod(expectedArg);
// NOTE:   ^ where the parentheses must be closed.

eq匹配器


argThat具有多个参数。

如果使用 ,则必须为所有参数提供匹配项。例如,如果在另一种情况下,您有另一个具有2个参数的方法:argThat

    verify(mock).mymethod2(eq("VALUE_1"), argThat((x)->false));
    // above is correct as eq() is also an argument matcher.

verify(mock).mymethod2("VALUE_1", argThat((x)->false));

// above is incorrect; an exception will be thrown, as the first arg. is given without an argument matcher.

哪里:

import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;

原始问题失败的根本原因是括号中的错误位置:

  • verify(mock.mymethod....这是错误的。右边是:
  • verify(mock).*

推荐