我一直试图让Junit测试等待Async任务完成但是一直被卡住了。 假设我们有这样的课程
class MyViewModel{
public void doSomething(){
new Task(){
void inBackground(){
model.getData(); //Executes for 4000 ms max
void onMainThread(){
displayData();
}
}
}
void displayData(){
}
}
这是我的测试方法
@UiThreadTest
@Test
public void someTest() throws Exception{
MyViewModel myViewModel = Mockito.spy(new MyViewModel());
myViewModel.doSomething();
Thread.sleep(5000);
verify(myViewModel).displayData();
}
我面临的问题是verify
语句在displayData
的内部类MyViewModel
之前被调用,并且测试用例失败。我该如何解决这个问题?任何其他测试相同功能的方法也是受欢迎的。
答案 0 :(得分:0)
我更喜欢使用CountDownLatch
final CountDownLatch signal = new CountDownLatch(1);
public void someTest() throws Exception{
MyViewModel myViewModel = Mockito.spy(new MyViewModel());
myViewModel.doSomething();
// It will wait either 5 secs or your countDown signal from
//postexecute from task
signal.await(5, TimeUnit.SECONDS);
verify(myViewModel).displayData();
}
您还应该在执行后调用signal.countDown()
。如果您不想等待5秒,并且只是想确保验证仅在完整的后台进程后运行,而不是在signal.await()
中提供任何参数
答案 1 :(得分:0)
我通过使用处理程序解决了这个问题。
在测试类的setUp方法中,我创建了一个处理程序。
@UiThreadTest
@Before
public void setUp() throws Exception {
handler = new Handler();
}
请注意,我使用@UiThreadTest批注方法将处理程序与UiThread相关联。
在测试方法中,我使用处理程序在ui线程上运行viewmodel代码,在另一个线程上运行verify方法。请注意,我在这里删除了@UiThreadTest注释。
@Test
public void testThatInspectionsAreFetchedWhenVesselIdIsSet() throws Exception{
MyViewModel myViewModel = Mockito.spy(new MyViewModel());
handler.post(() -> myViewModel.doSomething());
Thread.sleep(5000);
verify(myViewModel).displayData();
}
现在测试方法完美无缺!