Mockito - 使用参数测试方法的正确方法

Mockito - right way to test a method with params

我需要你的帮助:

我有这个方法:

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") 后将其设为 return 字符串,将解决此问题,但似乎 NPE 就是我得到的。 我做错了什么?

谢谢

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

  1. 你应该为 mApi
  2. 创建间谍
  3. 您应该为 JSONObject result
  4. 创建存根
  5. 您应该使用 MyTestClass 的真实实现

因此您的 SUT class 应该允许注入依赖项:

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