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
那么:
- 你应该为
mApi
创建间谍
- 您应该为
JSONObject result
创建存根
- 您应该使用 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);
}
我需要你的帮助:
我有这个方法:
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
那么:
- 你应该为
mApi
创建间谍
- 您应该为
JSONObject result
创建存根
- 您应该使用 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);
}