具有通用方法的 Mockito
Mockito with generic method
我正在尝试使用 mockito 在我的 class 上模拟一个通用方法,但是当测试代码运行时,我总是得到一个 NullPointerException。
这是我要模拟的 class。
public abstract class MyClass{
public abstract <T> T find(T t);
}
我的测试代码看起来像这样。
@Mock private MyClass myClass;
public testOnReceive(){
Mockito.when(
myClass.find(Mockito.isA(BroadcastReceiver.class))).
thenReturn(broadcastReceiver);
myReceiver.onReceive(context,intent);
}
最后,我要测试的 class 是 BroadcastReceiver class 的扩展,这是我要测试的代码
public class MyReceiver extendes BroadcastReceiver{
public onReceive(Context context , Intent intent){
...
...
myClass.find(this);
}
}
问题出在 class 的模拟上。 class 实际上被模拟了(它不是 null)但是当调用泛型方法时我得到一个 null。
有什么想法吗?
谢谢
这里有一个适合您的解决方案,即使您有部分模拟(即对于某些方法,您希望调用真实方法,而有时您需要模拟):
public class AbstractMethodMocker implements Answer<Object> {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable
{
Answer<Object> answer;
if (isAbstract(invocation.getMethod().getModifiers()))
answer = RETURNS_DEFAULTS;
else
answer = CALLS_REAL_METHODS;
return answer.answer(invocation);
}
}
@Test
public void testOnReceive() {
MyClass clazz = mock(MyClass.class, new AbstractMethodMocker());
when(clazz.find(any(BroadcastReceiver.class)).thenReturn(broadcastReceiver);
myReceiver.onReceive(context, intent);
}
Here is a great blog 讨论了使用 Mockito 框架处理抽象 类(及其方法)的策略。
我的解决方案与 Tim 建议的类似,但使用的是不同类型的 Answer 对象。
虽然我不完全明白为什么,但对我有用的是以下内容。
MyClass myClass = Mockito.mock(MyClass.class , Mockito.RETURNS_DEEP_STUBS);
之后我不需要指定任何有关调用方法的时间。
我正在尝试使用 mockito 在我的 class 上模拟一个通用方法,但是当测试代码运行时,我总是得到一个 NullPointerException。
这是我要模拟的 class。
public abstract class MyClass{
public abstract <T> T find(T t);
}
我的测试代码看起来像这样。
@Mock private MyClass myClass;
public testOnReceive(){
Mockito.when(
myClass.find(Mockito.isA(BroadcastReceiver.class))).
thenReturn(broadcastReceiver);
myReceiver.onReceive(context,intent);
}
最后,我要测试的 class 是 BroadcastReceiver class 的扩展,这是我要测试的代码
public class MyReceiver extendes BroadcastReceiver{
public onReceive(Context context , Intent intent){
...
...
myClass.find(this);
}
}
问题出在 class 的模拟上。 class 实际上被模拟了(它不是 null)但是当调用泛型方法时我得到一个 null。
有什么想法吗?
谢谢
这里有一个适合您的解决方案,即使您有部分模拟(即对于某些方法,您希望调用真实方法,而有时您需要模拟):
public class AbstractMethodMocker implements Answer<Object> {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable
{
Answer<Object> answer;
if (isAbstract(invocation.getMethod().getModifiers()))
answer = RETURNS_DEFAULTS;
else
answer = CALLS_REAL_METHODS;
return answer.answer(invocation);
}
}
@Test
public void testOnReceive() {
MyClass clazz = mock(MyClass.class, new AbstractMethodMocker());
when(clazz.find(any(BroadcastReceiver.class)).thenReturn(broadcastReceiver);
myReceiver.onReceive(context, intent);
}
Here is a great blog 讨论了使用 Mockito 框架处理抽象 类(及其方法)的策略。
我的解决方案与 Tim 建议的类似,但使用的是不同类型的 Answer 对象。 虽然我不完全明白为什么,但对我有用的是以下内容。
MyClass myClass = Mockito.mock(MyClass.class , Mockito.RETURNS_DEEP_STUBS);
之后我不需要指定任何有关调用方法的时间。