Mockito - 用params测试方法的正确方法

时间:2015-07-20 10:38:33

标签: android mocking mockito spy

我需要你的帮助:

我有这个方法:

public class MyTestClass {

protected void foo(JSONObject result, String text){
        String userId = result.optString("name");
        mApi.sendInfo(userId, text, mListener);
    }
}

在Mockito我做:

@Test
public void whenFooIsCalledThenSendInfoGetsCalled(){
    MyTestClass testClassSpy = spy(mMyTestClass);
    JSONObject jsonOb = mock(JSONObject.class);
    when(jsonOb.optString("name")).thenReturn("something");

    testClassSpy.foo(eq(jsonOb), anyString());

    ....
    some verification....

问题是,调用foo方法时,JSONObject结果为null。 我似乎无法让这个工作。我认为如果我嘲笑对象并让它在调用optString(" name")后返回一个String,就可以解决这个问题,但似乎NPE就是我得到的。 我做错了什么?

谢谢你

1 个答案:

答案 0 :(得分:1)

我不是来自Java世界,但当我查看此代码段时,我不确定您要测试的是什么。如果您想确切验证测试方法的建议 whenFooIsCalledThenSendInfoGetsCalled ,那么:

  1. 您应该为mApi
  2. 创建间谍
  3. 您应该为JSONObject result
  4. 创建存根
  5. 您应该使用MyTestClass的实际实现
  6. 所以你的SUT类应该允许注入依赖项:

    public class MyTestClass {
       private mApi;
       public MyTestClass(Api api) {
           mApi = api;
       }
    
       void foo(JSONObject result, String text){ /* your implementation */}
    }
    

    你的测试方法:

    @Test
    public void whenFooIsCalledThenSendInfoGetsCalled(){
        // arrange test
        Api spyApi = spy(Api.class);
        JSONObjec stub = mock(JSONObject.class);
        when(stub.optString("name")).thenReturn("something");
    
        MyTestClass sut = new MyTestClass(spyApi);
    
        // Act
        sut.foo(stub, "text");
    
        // Assert
        verify(spyApi , times(1)).foo(eq("something"), "text", listener);
    }