使用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
相关产品推荐
相关产品推荐

