我想测试打开线程并返回回调的函数。 每次在第一个测试用例之后第二个测试挂起并在日志中我看到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方法应该挂起测试。
答案 0 :(得分:0)
在Android中使用CountDownLatch时,通常会在调用countDown并等待同一个Thread时出现问题。
我不知道IRequest,但像onReceiveInfoCompleted这样的回调通常在主线程上运行:
@Override
public void onReceiveInfoCompleted() {
assertNull(“message”, …);
assertNull("message", …);
latch.countDown();
}
因此在你正在调用的同一个线程上等待。但是,当你首先在线程上调用等待时,你将永远不会倒计时。