我如何指示等待改造响应的测试?

时间:2019-05-19 15:32:54

标签: android junit retrofit2 robolectric

您好,我正在尝试开发单元测试,要从api中获取数据以执行此操作,我有以下内容:

@RunWith(RobolectricTestRunner.class)
public class RouteTest {
    LoginRepository profileRepository = new LoginRepository(RuntimeEnvironment.application);
    MapRepository mapRepository = new MapRepository(RuntimeEnvironment.application);

    private ActivityController<LoginActivity> loginController;
    private ActivityController<MapActivity> mapController;

    private LoginActivity loginActivity;
    private MapActivity mapActivity;

    private void createActivitiesWithIntents() {
        loginActivity = loginController.create().start().get();
        mapActivity = mapController.create().start().get();
    }

    @Before
    public void setUp() {
        loginController = Robolectric.buildActivity(LoginActivity.class);
        mapController = Robolectric.buildActivity(MapActivity.class);
    }

    @Test
    public void testCalculateRoute() {
        System.out.println("Start Test");

        MutableLiveData<ApiResponseWithDataList<LoginData>> loginData = new MutableLiveData<>();
        MutableLiveData<ApiResponseWithData<ItineraryResponseData>> itineraryData = new MutableLiveData<>();

        profileRepository.login(loginData, EMAIL, PASS);
        createActivitiesWithIntents();

        loginData.observe(loginActivity, (@Nullable ApiResponseWithDataList<LoginData> loginResponse) -> {
            System.out.println("Do login for get Access Token");

            String accessToekn = loginResponse.getData().getAccessToken();
            ItineraryBody itineraryBody = new ItineraryBody();

            mapRepository.calculateRoute(itineraryData, accessToekn, itineraryBody);
        });

        itineraryData.observe(mapActivity, (@Nullable ApiResponseWithData<ItineraryResponseData> itineraryResponse) -> {
            System.out.println("Getting route");

            System.out.println("Finish Test");
        });
    }
}

执行此测试时,我得到下一个输出

  

开始测试

     

登录获取访问令牌

然后测试永远不要等待itineraryData。观察到,有什么想法可以为测试做些什么等待itineraryData中的响应?

谢谢

1 个答案:

答案 0 :(得分:0)

不确定是否会回答您的问题,但是我认为您问题的根本原因是测试运行器 itineraryData.observe()在不同的线程上工作。

测试运行器线程对在其他线程中执行的进程一无所知,只是结束了测试(并且不再有控制台进程来显示观察者线程的输出)。

一种选择是使用Awaitility库,该库用于处理异步操作。

第二个选项是应用某种技巧以等待观察者线程完成其活动,然后再进行任何声明。像这样:

 handleCommentChange = (e) => {
      this.setState({
         comment_body: e.target.value
      })             
 }