无法弄清楚为什么android测试挂起

时间:2014-06-17 10:41:01

标签: android multithreading integration-testing mockito

我想测试打开线程并返回回调的函数。 每次在第一个测试用例之后第二个测试挂起并在日志中我看到ApacheSDK(32004):异常e:java.lang.NullPointerException。当我删除〜/ .android文件并清理项目时,错误消失但这并没有解决问题。 我使用CountDownLatch让测试的线程等待。 如果我将评论其中一个测试,另一个测试没有任何问题。我真的不能理解我的代码或ADT中的问题。

public class HelperTest extends ActivityInstrumentationTestCase2<MainActivity> {

  @Test
  public void test_A() throws Throwable {
    TestAdInfoMock info = new TestAdInfoMock();
    final CountDownLatch latch = new CountDownLatch(1);

    when(util.execute()).thenReturn(X, Y, Z,
            T);
    final IRequest requestComplete = new IRequest() {

        @Override
        public void onReceiveInfoCompleted() {
            assertNull(“message”, …);
            assertNull("message", …);
            latch.countDown();
         }
    };

    //The requestData opens thread with AsyncTask
    Helper.requestData(context, requestComplete); 
    boolean await = latch.await(2, TimeUnit.SECONDS);
    assertTrue(await);
}

 @Test
 public void test_B() throws Throwable {
    final CountDownLatch latch = new CountDownLatch(1);

    when(util.execute()).thenReturn(X, Y, Z,
            T);

     final IRequest requestComplete = new IRequest() {

        @Override
        public void onReceiveInfoCompleted() {
            assertNull(“message”, …);
            assertNull("message", …);
            latch.countDown();
         }
    };        
    //The requestData opens thread with AsyncTask
    Helper.requestData(context, requestComplete); //

    boolean await = latch.await(2, TimeUnit.SECONDS);
    assertTrue(await);
}


@Override
protected void tearDown() throws Exception {
    super.tearDown();
    clearPreferences();
}

void clearPreferences() {
    SharedPreferences preferences = getActivity().getSharedPreferences("global", 0);
    SharedPreferences.Editor editor = preferences.edit();
    editor.remove(KEY!);
    editor.remove(KEY2);
    editor.commit();
}

}

任何建议和意见表示赞赏。

编辑:

要弄清楚我开始做原始分析的问题:迭代。

当从tearDown方法中删除clearPreferences()方法时,所有测试工作正常。 但我仍然不明白为什么clearPreferences方法应该挂起测试。

1 个答案:

答案 0 :(得分:0)

在Android中使用CountDownLatch时,通常会在调用countDown并等待同一个Thread时出现问题。

我不知道IRequest,但像onReceiveInfoCompleted这样的回调通常在主线程上运行:

@Override
        public void onReceiveInfoCompleted() {
            assertNull(“message”, …);
            assertNull("message", …);
            latch.countDown();
         }

因此在你正在调用的同一个线程上等待。但是,当你首先在线程上调用等待时,你将永远不会倒计时。