【问题标题】:How can I indicate to a test that wait for a retrofit response?如何指示等待改造响应的测试?
【发布时间】:2019-05-19 15:32:54
【问题描述】:

您好,我正在尝试开发一个单元测试,为了从 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.observe,知道如何让测试等待 itineraryData 中的响应吗?

谢谢

【问题讨论】:

    标签: android junit retrofit2 robolectric


    【解决方案1】:

    不确定它是否会回答您的问题,但我认为您的问题的根本原因是 test runneritineraryData.observe() 在不同的线程上工作。 p>

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

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

    第二个选项是应用某种 hack 来等待观察者线程完成它的活动,然后再做出任何断言。比如:

        try {
          final Optional<Thread> observerThread = Thread.getAllStackTraces().keySet()
              .stream()
              .filter(it -> it.getName().startsWith(YOUR_OBSERVER_THREAD_PREFIX))
              .filter(it -> it.getState().equals(RUNNABLE))
              .findFirst();
    
          //need to figure out how long will be enough for you 
          final int maxThreadSleep = 30; 
    
          int i = 0;
          while (observerThread.isPresent()
              && observerThread.get().getState().equals(RUNNABLE) && i < maxThreadSleep) {
            Thread.sleep(2);
            i++;
          }
        } catch (InterruptedException e) {
          System.out.println(e);
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 2021-08-02
      相关资源
      最近更新 更多