我想單元測試使用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