Модульное тестирование репозитория с использованием шаблона MVVM для Android - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь написать модульные тесты для репозитория при использовании шаблона MVVM в Android.

У меня есть репозиторий, который извлекал данные из сети с помощью модернизации

   public class ValidateCbuRepository {

    private static ValidateCbuRepository single_instance = null;

    private MutableLiveData<CBUValidationImageResponse> data = new MutableLiveData<>();

    public static ValidateCbuRepository getInstance() {
        if (single_instance == null)
            single_instance = new ValidateCbuRepository();

        return single_instance;
    }

    public MutableLiveData<CBUValidationImageResponse> processImage(String encodedString) {

        JsonObject postParam = new JsonObject();
        postParam.addProperty("image", encodedString);

        Api service = RetrofitClientInstance.getRetrofitInstance().create(Api.class);
        data.setValue(null);

        HttpUrl httpUrl = HttpUrl.parse("some url");
        Call<CBUValidationImageResponse> responseCall = service.getProcessedImage_cbu_validation(httpUrl.toString(),postParam);
        responseCall.enqueue(new Callback<CBUValidationImageResponse>() {
            @Override
            public void onResponse(Call<CBUValidationImageResponse> call, Response<CBUValidationImageResponse> response) {
                if(response.isSuccessful()) {
                    CBUValidationImageResponse res = response.body();
                    CBUValidationImageResponse cbuValidationImageResponse = res;
                    Log.i("CBU response ",""+cbuValidationImageResponse.toString());
                    cbuValidationImageResponse.setSuccess(true);
                    cbuValidationImageResponse.setShowProgres(false);
                    cbuValidationImageResponse.setError(false);
                    data.setValue(cbuValidationImageResponse);
                }
            }

            @Override
            public void onFailure(Call<CBUValidationImageResponse> call, Throwable t) {
                CBUValidationImageResponse cbuValidationImageResponse = new CBUValidationImageResponse();
                cbuValidationImageResponse.setError(true);
                cbuValidationImageResponse.setShowProgres(false);
                data.setValue(cbuValidationImageResponse);
                t.printStackTrace();
            }
        });
        return data;
    }
}

Устройствотестовая часть

 @Mock
    private Observer<CBUValidationImageResponse> observer;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);

    }


    @Test
    public void testApiResponse_success() {
        Api mockedApiInterface = Mockito.mock(Api.class);
        Call<CBUValidationImageResponse> mockedCall = Mockito.mock(Call.class);

        Mockito.when(mockedApiInterface.getProcessedImage_cbu_validation(any(),any())).thenReturn(mockedCall);
        try {
            Mockito.doAnswer(new Answer() {
                @Override
                public Void answer(InvocationOnMock invocation) throws Throwable {
                    Callback<CBUValidationImageResponse> callback = invocation.getArgument(0);

                    CBUValidationImageResponse cbuValidationImageResponse = new CBUValidationImageResponse();
                    cbuValidationImageResponse.setCBU_code("some code");
                    cbuValidationImageResponse.setHeight(7);
                    cbuValidationImageResponse.setBreadth(7);
                    cbuValidationImageResponse.setLength(7);

                    callback.onResponse(mockedCall, Response.success(cbuValidationImageResponse));
                    // or callback.onResponse(mockedCall, Response.error(404. ...);
                    // or callback.onFailure(mockedCall, new IOException());
                    return null;
                }
            }).when(mockedCall).enqueue(any(Callback.class));

            ValidateCbuRepository validateCbuRepository = new  ValidateCbuRepository();
            String encodedString= "";
            validateCbuRepository.processImage(encodedString).observeForever(observer); 

Получение исключения нулевого указателя в validateCbuRepository.processImage(encodedString).observeForever(observer).Следующий шаг - проверка наблюдателя.

Я ожидаю, что тест пройден.Что я здесь не так делаю?Я сделал нечто похожее на модель просмотра врагом, и тест прошел со 100% охватом кода.

Вызов для модификации является асинхронным.Это причина, по которой он не работает?

Редактировать: Кажется, что жизненные данные равны нулю во время тестирования, вызывающего NPE.

...