我尝试为我的项目创建单元测试。 在我的单元测试类中,我有两个方法testCalculate()和testLogin()。方法testCalculate()运行正常,意味着测试通过,我得到了正确的测试结果。
但是问题在于testLogin(),我希望我的代码会在监听器中打印一些东西,但它从不打印。意思是我从来没有得到这一行
(R',R')(R',G'),(R',B'),(G',G'),(G',B')(B',B')
我的登录方法,我想测试自己运行正常,这意味着如果我在我的真实应用程序中使用它,它将成功登录并返回我从服务器获得的一些数据。
请告知我的听众在单元测试中不起作用的可能原因。真的很感激任何帮助。
System.out.println("Login success ======= " + response.getResponseObject());
}
答案 0 :(得分:2)
我有同样的问题。我使用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
}
答案 1 :(得分:0)
我认为问题是将在time
之后调用回调,这意味着run asynchronus
,并且测试与其他(主)线程的时间不同。我没有关于Robolectric
测试的经验,但有点关于AndroidTestSuite
的经验。所以,我建议你在调用监听器回调之前需要一些等待时间。这是the sample和the 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();
}
}