2015-06-24 228 views
3

我學習改造和RxJava和我心中已經創建的測試連接github上:改造RxJava簡單測試

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(); 
} 

在那裏我錯了?

回答

4

由於異步調用您的測試在下載結果之前完成。這是典型的問題,你必須'告訴'測試等待結果。在普通的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(); 
} 

或者你可以使用BlockingObservable從RxJava:

// 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)); 
+0

謝謝回答,現在的工作! –

+0

如果有幫助,您可以將答案標記爲已接受。更多信息https://meta.stackexchange.com/a/5235/182191 –

+0

爲什麼不使用observable toBlocking()。first(); –