Добавление обратного вызова Retrofit в модульный тест - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь провести довольно простой юнит-тест с использованием mockito, но у меня возникли проблемы с обратным вызовом.Я изучал несколько альтернатив, и некоторые из них кажутся хорошими, включая совместные процедуры и методы do answer с mockito.Я еще не смог найти хорошее решение, есть идеи?

Вот мой тест;

    //Test for add 5 minutes
@Test
public void testWithArgumentWithDummyReturnObject() throws ParseException {
    ParkingMeter testZone = new ParkingMeter();
    testZone.setZoneId("21788");
    testZone.setMeterName("Train Lot");

    Date startDate = dateFormat.parse("09/10/2018 1:00 PM");
    Date endDate = dateFormat.parse("09/10/2018 1:05 PM");
    Date expectedOutputDate = dateFormat.parse("09/10/2018 1:05 PM");

    CurrentSessionsResponse fakeResponse = new CurrentSessionsResponse();
    CurrentSession fakeSession = new CurrentSession("fake","","");
    fakeSession.zone = "Fake 1";

    ArrayList<CurrentSession> sessionlist = new ArrayList<>();
    sessionlist.add(fakeSession);
    fakeResponse.parkingSessions = sessionlist;

    MockRepository mockRepo = mock(MockRepository.class);

    doReturn(fakeResponse).when(mockRepo).getCurrentSessions();


    ExtendedVariableRateUtil variableRateUtil = new ExtendedVariableRateUtil();
    variableRateUtil.init(testZone,"", 360, mockRepo);
    variableRateUtil.setTime(5);

    assertThat(variableRateUtil.getDidJump(), is(false));
    assertThat(variableRateUtil.getCurrentCustomerTime(), is(expectedOutputDate));
}

Вот соответствующий метод в тестируемом классе:

    fun init(zone: ParkingMeter, plateNumber: String, extendedVariableRateMaxDayMinutes: Int, repository: ParkSmarterRepository) {
    this.selectedZone = zone
    this.plateNumber = plateNumber
    this.extendedVariableRateMaxDayMinutes = extendedVariableRateMaxDayMinutes

    if (selectedZone.maxTime < extendedVariableRateMaxDayMinutes * 24 * 60) {
        //extendedVariableRateMaxDayJump  = selectedZone.maxTime!
    }

    repository.getCurrentSessions { list, message ->
        if (list?.size!! > 0) {
            list.forEach {
                if (it.zoneID == selectedZone.ZoneId && it.vehicle == plateNumber) {
                    isNewSession = false
                    var startDate = it.startTime
                    var endDate = it.endTime
                } else {
                    isNewSession = true
                }
            }
        }
        setCurrentCustomerTime()
    }
}

Функция обратного вызова от дооснащения:

fun getCurrentSessions(callback: (currentSessions: List<CurrentSession>?, message: String?) -> Unit) {
    val call = ParkSmarter.apiInterface.getCurrentSessions()
    call.enqueue(object : Callback<CurrentSessionsResponse> {
        override fun onResponse(call: Call<CurrentSessionsResponse>, responseParkSmarter: Response<CurrentSessionsResponse>?) {
            try {
                callback(responseParkSmarter?.body()?.parkingSessions, responseParkSmarter?.body()?.psResponse?.Message)
            } catch (ex: Exception) {
                ex.printStackTrace()
            }
        }

        override fun onFailure(call: Call<CurrentSessionsResponse>, t: Throwable?) {
            callback(null, "Network Error")
        }
    })
}

и дооснащения вызова

    @Headers(HEADERS)
@GET("/api/ParkingSession")
Call<CurrentSessionsResponse> getCurrentSessions();
...