Mockito与通用方法

时间:2015-03-12 10:51:24

标签: java android generics mockito

我正在尝试使用mockito在我的类上模拟一个泛型方法,但是当测试代码运行时,我总是得到一个NullPointerException。

这是我想要模拟的课程。

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

}

最后我尝试测试的类是BroadcastReceiver类的扩展,这是我要测试的代码

public class MyReceiver extendes BroadcastReceiver{
       public onReceive(Context context , Intent intent){
             ...
             ...
             myClass.find(this);
       }
}

问题在于嘲笑班级。该类实际上被模拟(它不是null)但是当调用泛型方法时,我得到一个null。

有什么想法吗?

谢谢

2 个答案:

答案 0 :(得分:1)

这是一个适合你的解决方案,即使你有部分模拟(即某些方法你想要调用真正的方法,有时你想要模拟):

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框架处理抽象类(及其方法)的策略。

答案 1 :(得分:0)

我的解决方案类似于Tim建议但使用不同类型的Answer对象。 虽然我不完全理解为什么,但对我有用的是以下内容。

MyClass myClass = Mockito.mock(MyClass.class , Mockito.RETURNS_DEEP_STUBS);

之后,我不需要指定何时调用该方法。