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

使用Mockito 2测试Final类方法未达预期,请求排查问题

看起来你遇到了两个核心问题,导致Mock Final类的测试不符合预期,我来帮你逐一分析解决:

1. Mock对象默认不会执行真实方法逻辑

当你通过Mockito.mock(LoginActivity::class.java)创建Mock对象时,Mockito的默认行为是替换所有方法的实现,返回对应类型的默认值(比如Boolean类型默认返回false),而不会执行原类中的真实方法。这就是为什么你的断言会失败——你预期原方法返回true,但Mock对象返回了默认的false。

如果你希望Mock对象调用特定方法的真实实现,可以通过thenCallRealMethod()来指定:

class LoginActivityTest{
    @Test
    fun checkLoginValidity(){
        val loginActivity = Mockito.mock(LoginActivity::class.java)
        // 让isEmailValid方法执行真实逻辑
        Mockito.`when`(loginActivity.isEmailValid(Mockito.anyString())).thenCallRealMethod()
        assert(loginActivity.isEmailValid("yuo"))
    }
}

如果你想让大部分方法都执行真实逻辑,只Mock特定方法,更适合用@Spy注解(Spy基于真实对象创建,默认执行真实方法):

class LoginActivityTest{
    @Spy
    private lateinit var loginActivity: LoginActivity

    @Before
    fun setUp() {
        // 初始化Spy对象
        loginActivity = LoginActivity()
        MockitoAnnotations.openMocks(this)
    }

    @Test
    fun checkLoginValidity(){
        assert(loginActivity.isEmailValid("yuo"))
    }
}

2. 确认mock-maker-inline的配置路径是否正确

要让Mockito支持Final类/方法的Mock,配置文件的路径必须严格符合要求:

  • 必须在测试资源目录下创建mockito-extensions子目录,完整路径为:src/test/resources/mockito-extensions/
  • 在该目录下创建名为org.mockito.plugins.MockMaker的文件(无后缀名)
  • 文件内容仅为mock-maker-inline(不要有多余的空格、换行或其他字符)

请检查你的项目:

  • 确保配置文件放在test/resources下,而不是main/resources
  • 文件名和目录名没有拼写错误(比如不要把mockito-extensions写错,或者给文件加.txt后缀)

额外检查项

  • 确认你的Mockito版本是2.10.0及以上(这是支持inline Mock Maker的最低版本)
  • 如果使用Mockito Kotlin扩展,确保依赖版本与核心Mockito版本兼容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:40:37