您好,我正在尝试开发单元测试,要从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中的响应?
谢谢
答案 0 :(得分:0)
不确定是否会回答您的问题,但是我认为您问题的根本原因是测试运行器和 itineraryData.observe()在不同的线程上工作。
测试运行器线程对在其他线程中执行的进程一无所知,只是结束了测试(并且不再有控制台进程来显示观察者线程的输出)。
一种选择是使用Awaitility库,该库用于处理异步操作。
第二个选项是应用某种技巧以等待观察者线程完成其活动,然后再进行任何声明。像这样:
handleCommentChange = (e) => {
this.setState({
comment_body: e.target.value
})
}