Android Java单元测试:验证子类调用父类Activity方法
如何验证Android Activity子类调用父类方法的单元测试?
你的测试方式确实有问题,咱们来拆解下问题出在哪:
你现在的代码里,创建了两个完全独立的对象:一个是真实的MyActivity实例myActivity,另一个是单独mock出来的Activity spy对象mockActivity。当你调用myActivity.myMethod()时,执行的是这个实例自身继承的moveTaskToBack方法,和你那个单独的mockActivity没有任何关联——Mockito自然会告诉你“没有交互发生”,因为这俩根本不搭边。
正确的测试方式
要验证子类调用父类方法的行为,你需要spy你要测试的MyActivity实例,这样既能执行myMethod的真实逻辑,又能监控它调用父类方法的动作。
基础版测试代码如下:
@Test public void testMyMethodCallsMoveTaskToBack() { // 创建MyActivity的spy对象,保留真实逻辑同时监控方法调用 MyActivity myActivitySpy = Mockito.spy(new MyActivity()); // 调用目标方法 myActivitySpy.myMethod(); // 验证spy对象上的moveTaskToBack方法是否被调用了1次,参数为false Mockito.verify(myActivitySpy, Mockito.times(1)).moveTaskToBack(false); }
注意Android环境的坑
不过要提醒你:直接newActivity在纯JVM单元测试环境下大概率会报错,因为Android的Activity依赖系统上下文等框架资源。这时候推荐用Robolectric来模拟Android运行环境,让测试能正常执行:
@RunWith(RobolectricTestRunner.class) public class MyActivityTest { @Test public void myMethod_shouldInvokeMoveTaskToBack() { // 用Robolectric创建并初始化MyActivity实例 MyActivity myActivity = Robolectric.buildActivity(MyActivity.class) .create() .get(); // spy这个经过初始化的实例 MyActivity spyActivity = Mockito.spy(myActivity); // 调用方法 spyActivity.myMethod(); // 验证父类方法被调用 Mockito.verify(spyActivity).moveTaskToBack(false); } }
核心思路就是:你要监控的是你测试的那个MyActivity实例的方法调用,而不是一个完全无关的Activity mock对象。这样才能捕获到myMethod内部调用父类方法的行为。
内容的提问来源于stack exchange,提问作者hello_world
相关产品推荐
相关产品推荐

