0

我需要你的帮助:

我有这个方法:

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 结果为空。我似乎无法让它工作。我认为如果我模拟该对象并使其在调用 optString("name") 后返回一个字符串,将解决这个问题,但似乎 NPE 就是我得到的。我究竟做错了什么?

谢谢

4

1 回答 1

1

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

  1. 你应该为mApi
  2. 您应该为JSONObject result
  3. 您应该使用 MyTestClass 的真实实现

所以你的 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);
}
于 2015-07-20T11:07:41.187 回答