没有在单元测试中调用监听器

时间:2016-01-19 07:23:15

标签: android unit-testing android-volley robolectric

我尝试为我的项目创建单元测试。 在我的单元测试类中,我有两个方法testCalculate()和testLogin()。方法testCalculate()运行正常,意味着测试通过,我得到了正确的测试结果。

但是问题在于testLogin(),我希望我的代码会在监听器中打印一些东西,但它从不打印。意思是我从来没有得到这一行

(R',R')(R',G'),(R',B'),(G',G'),(G',B')(B',B')

我的登录方法,我想测试自己运行正常,这意味着如果我在我的真实应用程序中使用它,它将成功登录并返回我从服务器获得的一些数据。

请告知我的听众在单元测试中不起作用的可能原因。真的很感激任何帮助。

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

}

2 个答案:

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