Retrofit RxJava 简单测试
Retrofit RxJava Simple test
我正在学习 Retrofit 和 RxJava,我已经创建了连接测试 github:
public class GitHubServiceTests {
RestAdapter restAdapter;
GitHubService service;
@Before
public void setUp(){
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();
restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.setConverter(new GsonConverter(gson))
.build();
service = restAdapter.create(GitHubService.class);
}
@Test
public void GitHubUsersListObservableTest(){
service.getObservableUserList().flatMap(Observable::from)
.subscribe(user -> System.out.println(user.login));
}
当我执行测试时,我在控制台中看不到任何内容。但是当我执行另一个测试时
@Test
public void GitHubUsersListTest(){
List<User> users = service.getUsersList();
for (User user : users) {
System.out.println(user.login);
}
有效,我在我的控制台中看到了用户的登录信息
这是我的改造界面:
public interface GitHubService {
@GET("/users")
List<User> getUsersList();
@GET("/users")
Observable<List<User>> getObservableUserList();
}
我哪里错了?
由于异步调用,您的测试在下载结果之前完成。这是典型问题,您必须 'tell' 测试才能等待结果。在普通的 java 中,它将是:
@Test
public void GitHubUsersListObservableTest(){
CountDownLatch latch = new CountDownLatch(N);
service.getObservableUserList()
.flatMap(Observable::from)
.subscribe(user -> {
System.out.println(user.login);
latch.countDown();
});
latch.await();
}
或者您可以使用 RxJava 中的 BlockingObservable:
// This does not block.
BlockingObservable<User> observable = service.getObservableUserList()
.flatMap(Observable::from)
.toBlocking();
// This blocks and is called for every emitted item.
observable.forEach(user -> System.out.println(user.login));
我正在学习 Retrofit 和 RxJava,我已经创建了连接测试 github:
public class GitHubServiceTests {
RestAdapter restAdapter;
GitHubService service;
@Before
public void setUp(){
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();
restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.setConverter(new GsonConverter(gson))
.build();
service = restAdapter.create(GitHubService.class);
}
@Test
public void GitHubUsersListObservableTest(){
service.getObservableUserList().flatMap(Observable::from)
.subscribe(user -> System.out.println(user.login));
}
当我执行测试时,我在控制台中看不到任何内容。但是当我执行另一个测试时
@Test
public void GitHubUsersListTest(){
List<User> users = service.getUsersList();
for (User user : users) {
System.out.println(user.login);
}
有效,我在我的控制台中看到了用户的登录信息
这是我的改造界面:
public interface GitHubService {
@GET("/users")
List<User> getUsersList();
@GET("/users")
Observable<List<User>> getObservableUserList();
}
我哪里错了?
由于异步调用,您的测试在下载结果之前完成。这是典型问题,您必须 'tell' 测试才能等待结果。在普通的 java 中,它将是:
@Test
public void GitHubUsersListObservableTest(){
CountDownLatch latch = new CountDownLatch(N);
service.getObservableUserList()
.flatMap(Observable::from)
.subscribe(user -> {
System.out.println(user.login);
latch.countDown();
});
latch.await();
}
或者您可以使用 RxJava 中的 BlockingObservable:
// This does not block.
BlockingObservable<User> observable = service.getObservableUserList()
.flatMap(Observable::from)
.toBlocking();
// This blocks and is called for every emitted item.
observable.forEach(user -> System.out.println(user.login));