我想单元测试使用com.basho.riak的代码:riak-client:2.0.0。我嘲笑所有的riak客户端类,并希望得到一个无用的,但工作测试。然而,这种失败,一个空指针:如何模拟riak java客户端?
java.lang.NullPointerException
at com.basho.riak.client.api.commands.kv.KvResponseBase.convertValues(KvResponseBase.java:243)
at com.basho.riak.client.api.commands.kv.KvResponseBase.getValue(KvResponseBase.java:150)
at com.basho.riak.client.api.commands.kv.FetchValue$Response.getValue(FetchValue.java:171)
我的测试是这样的:
@Test public void test() {
RiakClient riakClient = mock(RiakClient.class);
@SuppressWarnings("unchecked")
RiakCommand<FetchValue.Response, Location> riakCommand = (RiakCommand<FetchValue.Response, Location>) mock(RiakCommand.class);
Response response = mock(Response.class);
when(riakClient.execute(riakCommand)).thenReturn(response);
Response returnedResponse = riakClient.execute(riakCommand);
when(response.getValue(Object.class)).thenReturn(new Object());
MyPojo myData = returnedResponse.getValue(MyPojo.class);
// Make assertions
}
如何做到这一点使用了Riak客户端,您的单元测试代码?最终,我想确保使用期望的类型/存储桶/组合键,并且运行预期的RiakCommand。
编辑:我挖了到FetchValue类,发现这个结构:
FetchValue
- 是public final
FetchValue.Response
- 为public static
,
- 有一个包私有构造Response(Init<?> builder)
FetchValue.Response.Init<T>
是:
- protected static abstract class Init<T extends Init<T>> extends KvResponseBase.Init<T>
而且有FetchValue.Response.Builder
:
static class Builder extends Init<Builder>
- 与构建()认为:return new Response(this);
我假设的Mockito获取内部类中某处丢失,我的电话在KvResponseBase.convertValues
,其中NP抛出结束。 KvResponseBase.convertValues
假设值为List<RiakObject>
,我没有看到分配它的理智方式。
已接受。你关于Mockito的发现真的令人印象深刻。你帮助我认识到Mockito不是完成这项任务的完美工具。现在你已经注意到了riakClient的代码,你有什么建议如何测试使用它的代码?谢谢! – Mrtn 2015-02-12 15:48:06
@Mrtn很乐意帮忙。我认为你应该提出一个新问题,揭露你想要测试的东西。我认为你会得到更广泛的帮助,因为它与mockito无关,而是与一般的(单元)测试有关。即使我在Riak的一些课程中看到了一些,我也是一位专家;) – gontard 2015-02-12 15:59:41