2016-01-19 78 views
0

我試圖爲我的項目創建單元測試。 在我的單元測試類中我有兩個方法testCalculate()和testLogin()。方法testCalculate()運行正常,這意味着測試通過了,我得到了正確的測試結果。未在單元測試中調用的監聽器

但問題是TESTLOGIN(),我希望我的代碼將在監聽器裏打印的東西,但它從來沒有printed.Meaning,我從來沒有得到這條線

System.out.println("Login success ======= " + response.getResponseObject()); 

我的登錄方法,我想測試自己運行良好,這意味着如果我在我的真實應用程序中使用它,它將成功登錄並返回從服務器獲得的一些數據。

請注意什麼是可能的原因,使我的聽衆不能在單元測試中工作。真的很感謝任何幫助。

@RunWith(RobolectricTestRunner.class) 
@Config(manifest = Config.NONE) 
public class LoginManagerTest { 

private static final String TAG = LoginManagerTest.class.getCanonicalName(); 
private String usernameStr = "[email protected]"; 
private String passwordStr = "********"; 
private LoginManager loginManager; 

@Test 
public void testLogin() throws Exception { 
    ResponseHandlerListener<String> listener = new ResponseHandlerListener<String>() { 
     @Override 
     public void onReceive(AxonResponse<String> response) { 
      System.out.println("Login success ======= " + response.getResponseObject()); 
      String loginSuccess = Constants.LOGIN_SUCCESS; 
      assertEquals(TAG, loginSuccess, response.getResponseObject()); 
     } 
    }; 

    Context context = Robolectric.getShadowApplication().getApplicationContext(); 
    loginManager = new LoginManager(context); 
    loginManager.login(usernameStr, passwordStr, null, listener); 

} 

@Test 
public void testCalculate() throws Exception { 
    Context context = Robolectric.getShadowApplication().getApplicationContext(); 
    loginManager = new LoginManager(context); 
    int num = 5; 
    int sum = loginManager.calculate(num); 
    System.out.println("sum = " + sum); 
    assertEquals(10, sum); 
} 

}

回答

0

我認爲這個問題是回調將被稱爲time後,就意味着run asynchronus,並且測試出來的時候與其他(主)線程。我沒有Robolectric測試的經驗,但有一點關於AndroidTestSuite。因此,我建議您在調用偵聽器回調之前需要一些等待時間。這裏是the samplethe other idea。希望有所幫助。

更新

嘗試下面的想法(未測試):

private Object lock = new Object(); 
@Test 
public void testLogin() throws Exception { 
    ResponseHandlerListener<String> listener = new ResponseHandlerListener<String>() { 
     @Override 
     public void onReceive(AxonResponse<String> response) { 
      System.out.println("Login success ======= " + response.getResponseObject()); 
      String loginSuccess = Constants.LOGIN_SUCCESS; 
      assertEquals(TAG, loginSuccess, response.getResponseObject()); 
      synchronized (lock) { 
       lock.notifyAll(); // Will wake up lock.wait() 
      } 
     } 
    }; 
    synchronized (lock) { 
     Context context = Robolectric.getShadowApplication().getApplicationContext(); 
     loginManager = new LoginManager(context); 
     loginManager.login(usernameStr, passwordStr, null, listener); 
     lock.wait(); 
    } 
} 
+0

嗨南,您的回覆我也想你的建議,也試過這個解決方案,在這個線程提及,但仍然沒有運氣,謝謝,我還沒有得到任何從我的聽衆 - > http://stackoverflow.com/questions/16816600/getting-robolectric-to-work-with-volley –

+0

@VierdaMilaNartila檢查我更新的答案,只是想法,因爲我沒有測試過它。祝你好運! – NamNH

1

我有同樣的問題。我通過使用Robolectric.flushForegroundThreadScheduler()解決。這將運行在forground線程上的排隊任務。

這將是這樣的:

@Test 
public void testLogin() throws Exception { 
    ResponseHandlerListener<String> listener = new ResponseHandlerListener<String>() { 
     @Override 
     public void onReceive(AxonResponse<String> response) { 
      System.out.println("Login success ======= " + response.getResponseObject()); 
      String loginSuccess = Constants.LOGIN_SUCCESS; 
      assertEquals(TAG, loginSuccess, response.getResponseObject()); 
     } 
    }; 

    Context context = Robolectric.getShadowApplication().getApplicationContext(); 
    loginManager = new LoginManager(context); 
    loginManager.login(usernameStr, passwordStr, null, listener); 
    ThreadSleep(500); //Wait for login process to be executed 
    Robolectric.flushForegroundThreadScheduler(); // this will run all the pending queue on Main Thread 
}