在这种情况下,哪个语句将首先执行?

时间:2018-05-03 12:11:54

标签: java android junit android-testing android-viewmodel

我一直试图让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之前被调用,并且测试用例失败。我该如何解决这个问题?任何其他测试相同功能的方法也是受欢迎的。

2 个答案:

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

现在测试方法完美无缺!