Я пытаюсь выполнить модульный тест, который использует 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>
is:
- 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>
значений, и я не вижу разумного способа его присвоения.