You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Junit测试含android.graphics.Path的方法报未Mock错误

解决Android本地JUnit测试中android.graphics.Path未mock的问题

这个问题我之前也碰到过,其实根源在于本地JUnit测试的运行环境:默认情况下,本地单元测试是在JVM上执行的,Android框架里像android.graphics.Path、graphics.Point这类系统类的方法都是空的stub(桩实现),没有实际逻辑,一旦直接调用就会抛出你看到的java.lang.RuntimeException: Method moveTo in android.graphics.Path not mocked异常。

下面给你几种可行的解决办法,你可以根据自己的测试需求选择:

1. 使用Mockito Mock图形类

如果你的测试只需要验证这些图形类的方法是否被正确调用,不需要实际执行图形操作的逻辑,那么用Mockito来mock这些类是最简单的方案。

步骤:

  • 首先确保你的build.gradle(Module级别)里添加了Mockito依赖:
testImplementation 'org.mockito:mockito-core:5.6.0' // 版本可按需使用最新稳定版
  • 在测试类中mock Path对象,并stub它的方法(因为moveTo是void方法,我们只需要让它调用时不报错即可):
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import android.graphics.Path;

@RunWith(MockitoJUnitRunner.class)
public class YourTestClass {

    @Mock
    private Path mockPath;

    @Test
    public void testPathOperation() {
        // 执行你的业务逻辑,比如调用某个使用mockPath的方法
        yourMethodUnderTest(mockPath);
        
        // 验证方法是否被正确调用(可选)
        Mockito.verify(mockPath).moveTo(100f, 100f);
    }
}

对于graphics.Point,同样可以用Mockito mock,处理方式完全一致。

2. 使用Robolectric获取框架类的模拟实现

如果你的测试需要实际执行一些图形类的逻辑(比如验证Path的路径是否正确),那么Robolectric会更合适——它提供了Android框架类的影子实现,可以在JVM上模拟Android环境,不需要mock就能正常调用这些类的方法。

步骤:

  • 添加Robolectric依赖到build.gradle:
testImplementation 'org.robolectric:robolectric:4.12.1' // 最新版本可按需调整
  • 在测试类上添加Robolectric的运行器注解,然后直接使用Path和Point:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import android.graphics.Path;
import android.graphics.Point;

@RunWith(RobolectricTestRunner.class)
public class YourTestClass {

    @Test
    public void testPathLogic() {
        Path path = new Path();
        path.moveTo(0f, 0f);
        path.lineTo(100f, 100f);
        
        // 这里可以正常执行Path的操作,不会抛出未mock的异常
        // 比如验证路径的某些属性
        Point point = new Point(50, 50);
        // 执行Point相关操作
    }
}

3. 使用Instrumented测试(运行在设备/模拟器)

如果你的测试必须依赖真实的Android框架实现(比如涉及复杂的图形渲染逻辑),那么可以改用Instrumented测试——这类测试运行在真实的Android设备或模拟器上,能直接使用完整的Android框架类,不会出现未mock的问题。

步骤:

  • 在build.gradle中确保Instrumented测试依赖:
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
  • 把测试类放在androidTest/java目录下,然后编写测试:
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import android.graphics.Path;

@RunWith(AndroidJUnit4.class)
public class YourInstrumentedTest {

    @Test
    public void testRealPathOperation() {
        Path path = new Path();
        path.moveTo(0f, 0f);
        // 这里可以完全正常使用Path的所有方法,和在真实App中一样
    }
}

不过这种测试的缺点是运行速度比本地JUnit测试慢很多,适合必须依赖真实环境的场景。

内容的提问来源于stack exchange,提问作者Ryan Wills

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:17:20