【发布时间】:2015-02-10 21:48:29
【问题描述】:
我正在尝试对使用 com.basho.riak:riak-client:2.0.0 的代码进行单元测试。我嘲笑了所有 riak 客户端类,并希望得到一个无用但有效的测试。但是,这会因空指针而失败:
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>
- 使用 build() :return new Response(this);
我假设 Mockito 在内部类中的某个地方迷路了,我的电话最终在KvResponseBase.convertValues 中结束,NP 被抛出。 KvResponseBase.convertValues 假定有 List<RiakObject> 的值,但我认为没有合理的分配方法。
【问题讨论】: