【问题标题】:Unit test while using retrofit使用改造时的单元测试
【发布时间】:2018-04-08 13:18:35
【问题描述】:

我有以下服务接口进行改造:

public interface TimetableService {

    @GET("url/")
    Call<Flixbus> getTimetable();
}

我想在改造电话后测试 UI:

@RunWith(AndroidJUnit4.class)
public class TestTimetablePresenter {

    private static List<Departure> DEPARTURES = Lists.newArrayList(
            new Departure("L006", "Stockholm",
                    new Datetime(1461056400, "GMT+02:00")),
            new Departure("L007", "Berlin",
                    new Datetime(1461056500, "GMT+02:00")));

    @Mock
    private TimetableContract.View mTimetableView;

    @Mock
    private TimetableService mockTimetableServiceImpl;

    @Captor
    private ArgumentCaptor<Callback<Flixbus>> mCallbackArgumentCaptor;

    private TimetablePresenter mNotesPresenter;



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

        SampleApp mApp = (SampleApp) InstrumentationRegistry.getInstrumentation()
                .getTargetContext().getApplicationContext();

        mNotesPresenter = new TimetablePresenter(mApp, mTimetableView);

        mNotesPresenter.setWebService(mockTimetableServiceImpl);
    }

    @Test
    public void loadDeparturesFromAPIAndLoadIntoView() {

      mNotesPresenter.loadDepartures();

        Mockito.verify(mockTimetableServiceImpl).getTimetable().enqueue(mCallbackArgumentCaptor.capture());

        InOrder inOrder = Mockito.inOrder(mTimetableView);
        inOrder.verify(mTimetableView).setProgressIndicator(true);
        inOrder.verify(mTimetableView).setProgressIndicator(false);
        Mockito.verify(mTimetableView).showDepartures(DEPARTURES);
    }
}

但是在这一行,我得到一个错误:

Mockito.verify(mockTimetableServiceImpl).getTimetable().enqueue(mCallbackArgumentCaptor.capture());

错误提示:

java.lang.NullPointerException: Attempt to invoke interface method 'retrofit2.Call retrofit2.Call.clone()' on a null object reference at com.ali.android.sample.timetable.TimetablePresenter.loadDepartures(TimetablePresenter.java:46) 

我不知道如何解决它。你有什么建议吗?

@Override
    public void loadDepartures() {

        mTimetableView.setProgressIndicator(true);

        service.getTimetable().clone().enqueue(new Callback<Flixbus>() {
            @Override
            public void onResponse(Call<Flixbus> call, Response<Flixbus> response) {
                Log.d(TAG, "response is successful :" + response.isSuccessful());
                mTimetableView.setProgressIndicator(false);
                if(response.isSuccessful()) {
                    mTimetableView.showDepartures(response.body().getTimetable().getDepartures());
                } else {
                    Log.d(TAG, "Response Code: " + response.code() + "Message: " + response.message());
                }
            }

            @Override
            public void onFailure(Call<Flixbus> call, Throwable t) {
                mTimetableView.setProgressIndicator(false);
                Log.e(TAG, t.getLocalizedMessage());
            }
        });
    }

【问题讨论】:

  • 你能展示一下你的演示者使用 loadDepartures() 方法吗?
  • @LeviAlbuquerque 我已将代码添加到我的问题中。

标签: android mockito retrofit2


【解决方案1】:

您是否尝试过切换验证顺序?通常模拟验证是在与被测类交互之后进行的。

// I believe TimetableService#getTimetable().enqueue(...) is called inside TimetablePresenter#loadDepartures()
mNotesPresenter.loadDepartures();
Mockito.verify(mockTimetableServiceImpl).getTimetable().enqueue(mCallbackArgumentCaptor.capture());

【讨论】:

  • 你猜是对的,但是当改变它的位置时我得到另一个错误:java.lang.NullPointerException: Attempt to invoke interface method 'retrofit2.Call retrofit2.Call.clone()' on a null object参考 com.ali.android.sample.timetable.TimetablePresenter.loadDepartures(TimetablePresenter.java:46)
  • 这是正常的,因为默认情况下,模拟对象将为返回引用类型的方法返回 null。您必须使用 when(mockTimeTableServiceImpl).thenReturn(...) 对 mockTimetableServiceImpl 的 getTimetable() 方法进行存根,该方法应该返回一个 Call 对象。 Call 对象也可以是一个 mock,它的 enqueue(...) 方法被存根,以便在调用时调用 onResponse(...) 或 onFailure(...)。
猜你喜欢
  • 1970-01-01
  • 2016-10-20
  • 2020-09-05
  • 2017-12-22
  • 2014-10-22
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多