的Mockito。 validation方法参数

我一直在search这个,但没有发现任何相关的东西。 我有这样的东西:

Object obj = getObject(); Mockeable mock= Mockito.mock(Mockeable.class); Mockito.when(mock.mymethod(obj )).thenReturn(null); Testeable obj = new Testeable(); obj.setMockeable(mock); command.runtestmethod(); 

现在,我想validation在runtestmethod()内部调用的mymethod(Object o)是否被Object o调用,而不是其他的。 但是我总是通过testing,无论我把validation,例如,与:

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

要么

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

要么

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

我总是通过testing。 我如何完成validation(如果可能的话)?

谢谢。

ArgumentMatcher的替代方法是ArgumentCaptor

官方示例:

 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()); } 

你是否试图利用对象的.equals方法来做逻辑平等? 您可以使用Mockito中包含的argThat匹配器来执行此操作

 import static org.mockito.Matchers.argThat 

接下来你可以实现你自己的参数匹配器,这个参数匹配器将会遵循每个对象的.equals方法

 private class ObjectEqualityArgumentMatcher<T> extends ArgumentMatcher<T> { T thisObject; public ObjectEqualityArgumentMatcher(T thisObject) { this.thisObject = thisObject; } @Override public boolean matches(Object argument) { return thisObject.equals(argument); } } 

现在使用你的代码,你可以更新它阅读…

 Object obj = getObject(); Mockeable mock= Mockito.mock(Mockeable.class); Mockito.when(mock.mymethod(obj)).thenReturn(null); Testeable obj = new Testeable(); obj.setMockeable(mock); command.runtestmethod(); verify(mock).mymethod(argThat(new ObjectEqualityArgumentMatcher<Object>(obj))); 

如果你只是为了EXACT相等(在内存中的相同的对象),只是做

 verify(mock).mymethod(obj); 

这将validation它被调用一次。

  • 如果您不使用其他匹配器,则不需要eq匹配器。
  • 你没有使用正确的语法 – 你的方法调用应该在.verify(mock)之外.verify(mock) 。 您现在正在对方法调用的结果进行validation,而不validation任何内容(不进行方法调用)。 因此所有的testing都通过了。

你的代码应该是这样的:

 Mockito.verify(mock).mymethod(obj); Mockito.verify(mock).mymethod(null); Mockito.verify(mock).mymethod("something_else"); 

你是否检查了可模拟类的equals方法? 如果这个返回值总是为真,或者你对同一个实例testing了同一个实例,并且这个等于方法没有被覆盖(因此只对引用进行检查),那么它返回true。

另一种方法是使用org.mockito.internal.matchers.Equals.Equals方法而不是重新定义一个:

 verify(myMock).myMethod((inputObject)Mockito.argThat(new Equals(inputObjectWanted))); 

你用相同的()匹配器试过吗? 如:

 verify(mockObj).someMethod(same(specificInstance)); 

我有同样的问题。 我试着用eq()匹配器和refEq()匹配器,但是我总是有误报。 当我使用相同的()匹配器时,当参数是不同的实例时,testing失败,并且一旦参数是相同的实例就传递。

您也可以使用TypeSafeDiagnosingMatcher

  private Matcher<GetPackagesRequest> expectedPackageRequest(final AvailabilityRequest request) { return new TypeSafeDiagnosingMatcher<GetPackagesRequest>() { StringBuilder text = new StringBuilder(500); @Override protected boolean matchesSafely(GetPackagesRequest req, Description desc) { String productCode = req.getPackageIds().iterator().next().getValue(); if (productCode.equals(request.getSupplierProductCode())) { text.append("ProductCode not equal! " + productCode + " , " + request.getSupplierProductCode()); return true; } text.append(req.toString()); return false; } @Override public void describeTo(Description d) { d.appendText(text.toString()); } }; } 

然后validation调用:

 Mockito.verify(client).getPackages(Mockito.argThat(expectedPackageRequest(request)));