的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)));
- 我可以有一个JMenuBar JTabbedPane?
- 如何将图像添加到JPanel?
- 在Java中将二进制inputstream读入单个字节数组
- 如何在Java中创build二维ArrayList?
- 如何检查FreeMarker模板中是否存在variables?
- Java“在此语言级别不支持的lambdaexpression式”
- 如何使用apt-get在Ubuntu 17.04 / 16.10 / 16.04 LTS / 15.10 / 15.04 / 14.10 / 14.04 LTS / 13.10 / 13.04上安装Maven 3?
- ClassNotFoundException:未find类“com.google.android.gms.ads.AdView”
- 为什么Enumeration转换为ArrayList而不是java.utils中的List?