我想mock接受对象参数的方法mockedMethod(Object Object)
。此对象参数是从TestedMethod
动态创建的。MockedMethod
不会返回预期的结果,尽管这两个对象具有相同的数据,但只是不同的哈希代码。
public void testedMethod() {
Object object = initObject(); // this object is initialized dynamically
Long result = mockedMethod(object);
...
}
@Test
public void test() {
Object object = new Object();
when(api.mockedMethod(object).thenReturn(3L);
testedMethod();
}
有没有什么方法来模拟方法,使它能够以预期的结果响应?
似乎你有两个选择:
您可以使用any()
或notnull()
,正如geoand在注释中提到的那样。它们定义任何参数(any
)或任何非空参数(Notnull
)的行为。
when(api.mockedMethod(Mockito.any()).thenReturn(3L);
// or
when(api.mockedMethod(Mockito.notNull()).thenReturn(3L);
这些静态方法返回参数匹配器,并且可以在从匹配器对象继承的Mockito对象上找到(以保持API之间的一点点分离)。
如果需要检查对象是否匹配某些自定义条件,可以使用自定义ArgumentMatcher对象。这些对象(也称为Hamcrest匹配器,因为它们直接来自Hamcrest库)只有一个布尔方法,如果对象匹配条件,则返回true。
/** Returns true if the passed object has FooBar anywhere in its class name. */
class HasFooBarInClassName extends ArgumentMatcher<Object> {
@Override public boolean matches(Object object) {
return object.getClass().getName().contains("FooBar");
}
}
when(api.mockedMethod(argThat(new HasFooBarInClassName())).thenReturn(3L);
有时,您的代码需要“捕获”对象以进行额外的验证或处理,这是Mockito无法单独完成的。您可以使用argumentcaptor
来帮助您:
ArgumentCaptor<Object> captor = ArgumentCaptor.for(Object.class);
when(api.mockedMethod(any()).thenReturn(3L);
testedMethod();
verify(api).mockedMethod(captor.capture());
// Now you can check the object, as needed, using your own methods.
checkObjectAsNeeded(captor.getValue());
我有一个类,它有以下实现: 如您所见,方法调用,然后在返回结果之前执行一些逻辑。 当我试图模拟这个存储库进行单元测试时,我很难从中获得结果,因为它总是作为空引用异常而失败。 以下是单元测试: 如何使此测试工作,使模拟方法在调用被模拟的方法之后执行一些逻辑?
我有一个带有两个衰减函数(ES 2.4.4)的查询,我使用对查询项中的衰减函数得分求和。对于测试,我使用来防止任何其他分数(来自查询)影响我的分数(我想测试衰减函数)。 这些是我的衰减函数: 我的结果包括2篇不同日期的文章(2017-08-28,2009-05-08)具有相同的优先级(1000)和相同的分数!(13.122)怎么会这样?为什么没有获得更好的分数?所以我试图解释查询。 对于2017-
如何模拟返回已强制转换的模拟对象的方法。 试验方法。
我调用了一个方法,它连接到另一个服务器,每次调用它,它都返回不同的数据。 我正在为调用该方法的类编写一个单元测试。我已经嘲笑了那个类,我希望它返回存根结果。它实际上使用工作,但是它每次都返回相同的数据。我希望它返回不同的数据,我希望能够指定它应该是什么。 我试着使用“doReturn-when”,它可以工作,但我无法让它返回不同的结果。我不知道怎么做。 我还尝试使用“when-thenReturn
试图找出这个微不足道的例子的分数。我希望得到brenda eaton的文件,但我得到的是brenda fassie的最佳结果。
我有以下命名查询; 当我执行代码时; 我没有得到Person类型的resultList,即使我已经明确指定了命名查询的参数。相反,我得到的类型是包含对象数组的向量。 如何使查询显式返回“Person”类型?