我正在尝试编写一个测试,用于与云服务通信的Android应用程序。
理论上,测试的流程应该是这样的:
- 在工作线程中向服务器发送请求
- 等待来自服务器的响应
- 检查服务器返回的响应
我正在尝试使用Espresso的IdlingResource
类来实现这一点,但它并没有像预期的那样工作。以下是我目前拥有的内容:
我的测试:
@RunWith(AndroidJUnit4.class)
public class CloudManagerTest {
FirebaseOperationIdlingResource mIdlingResource;
@Before
public void setup() {
mIdlingResource = new FirebaseOperationIdlingResource();
Espresso.registerIdlingResources(mIdlingResource);
}
@Test
public void testAsyncOperation() {
Cloud.CLOUD_MANAGER.getDatabase().getCategories(new OperationResult<List<Category>>() {
@Override
public void onResult(boolean success, List<Category> result) {
mIdlingResource.onOperationEnded();
assertTrue(success);
assertNotNull(result);
}
});
mIdlingResource.onOperationStarted();
}
}
The FirebaseOperationIdlingResource
public class FirebaseOperationIdlingResource implements IdlingResource {
private boolean idleNow = true;
private ResourceCallback callback;
@Override
public String getName() {
return String.valueOf(System.currentTimeMillis());
}
public void onOperationStarted() {
idleNow = false;
}
public void onOperationEnded() {
idleNow = true;
if (callback != null) {
callback.onTransitionToIdle();
}
}
@Override
public boolean isIdleNow() {
synchronized (this) {
return idleNow;
}
}
@Override
public void registerIdleTransitionCallback(ResourceCallback callback) {
this.callback = callback;
}}
当与Espresso的视图匹配器一起使用时,测试会被正确执行,活动会等待并检查结果。
然而,普通的JUNIT4断言方法被忽略,JUnit不等待我的云操作完成。
IdlingResource
是否只能与Espresso方法一起使用?还是我做错了什么?
true
否则发送false
,并且你可以使用同步方法来保持工作,直到从服务器收到true
。 - Y.Kaan Yılmaz