代码之家  ›  专栏  ›  技术社区  ›  gokhan

如何为Android架构组件生命周期事件添加单元测试?

  •  4
  • gokhan  · 技术社区  · 6 年前

    我尝试为我的功能添加一个单元测试,它支持体系结构组件生命周期事件。为了支持生命周期事件,我添加了 @OnLifecycleEvent 函数的注释,当该事件发生时,我想做一些事情。

    一切都按预期工作,但我想为该函数创建一个单元测试,以便在预期的事件发生时检查函数的运行情况。

     public class CarServiceProvider implements LifecycleObserver {
    
        public void bindToLifeCycle(LifecycleOwner lifecycleOwner) {
            lifecycleOwner.getLifecycle().addObserver(this);
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        public void onClear() {
           Log.i("CarServiceProvider", "onClear called");
        }
     }
    

    我试图模仿LifecycleOwner并创建新的LifecycleRegistery来更改Lifecycle Observer的状态,但我没有这样做。

    我如何测试我的 onClear() 状态更改时调用的函数?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Victor Hugo Montes    6 年前

    尽管我不是一个大粉丝,我还是会和 Robolectric ActivityController

    考虑到 Observer pattern

    我这样做达到了预期的结果

    testCompile "org.robolectric:robolectric:3.5.1"
    

    @RunWith(RobolectricTestRunner.class)
    @Config(constants = BuildConfig.class)
    public class CarServiceProviderTest {
    
        @Test
        public void shouldFireOnClear(){
    
            //Grab the Activity controller
            ActivityController controller = Robolectric.buildActivity(JustTestActivity.class).create().start();
            AppCompatActivity activity = (AppCompatActivity) controller.get();
    
            //Instanciate our Observer
            CarServiceProvider carServiceProvider = new CarServiceProvider();
            carServiceProvider.bindToLifeCycle(activity);
    
            //Fire the expected event
            controller.stop();
    
            //Assert
            Assert.assertTrue(carServiceProvider.wasFired);
        }
    }
    

    汽车服务提供商.java

    public class CarServiceProvider implements LifecycleObserver {
    
        public boolean wasFired;
    
        public void bindToLifeCycle(LifecycleOwner lifecycleOwner) {
            lifecycleOwner.getLifecycle().addObserver(this);
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        public void onClear() {
            wasFired = true;
        }
    }
    
        2
  •  2
  •   Raz    6 年前

    LifecycleRegistry

    您的测试将执行如下操作:

    @Test
    public void testSomething() {
      LifecycleRegistry lifecycle = new LifecycleRegistry(mock(LifecycleOwner.class));
    
      // Instantiate your class to test
      CarServiceProvider carServiceProvider = new CarServiceProvider();
      carServiceProvider.bindToLifeCycle(lifecycle);
    
      // Set lifecycle state
      lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
    
      // Verify that the ON_STOP event was handled, with an assert or similar check
      ...
    }
    

    生命周期.event.on\destroy handleLifecycleEvent(Lifecycle.Event.on撏create)

        3
  •  0
  •   Dan Hartman    6 年前

    如果你想用一个真正的单元测试来测试它(而不是android test),你最好的选择是使用roboelectric,它模拟了android框架,roboelectric4.0即将发布。然而,您试图测试与Android框架的实际交互,因此这是一个更适合真正的集成测试套件和AndroidTest的任务。您可以对其进行单元测试,但最可靠的测试方法是在设备上实际调用Lifecycle事件(Espresso会做什么)并验证它的调用。