如何在Kotlin/Android中为object类编写JUnit单元测试?
Kotlin 单例object类独立JUnit测试写法
Kotlin里用object声明的单例本身不需要手动实例化,写独立单元测试的时候直接调用它的公开方法就行,逻辑和测普通类的公开方法没有本质区别,不需要额外做特殊处理。
基础测试代码示例
针对你贴的InfoHelper代码,用JUnit5写测试的话直接按下面的逻辑写就可以:
import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.Test // 这里补全Xyz、Result定义做演示,实际项目直接导入你自己的对应类即可 interface Xyz enum class Result : Xyz { OK, ERROR, TIMEOUT } class InfoHelperTest { @Test fun `传入Result_OK时method返回true`() { val checkResult = InfoHelper.method(Result.OK) assertTrue(checkResult) } @Test fun `传入非Result_OK参数时method返回false`() { // 遍历所有非OK的枚举值做校验,避免漏测分支 Result.values() .filter { it != Result.OK } .forEach { param -> assertFalse(InfoHelper.method(param)) } } }
如果是用JUnit4,只需要换对应导入和注解,核心逻辑完全一致:
import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test class InfoHelperTest { @Test fun method_returnTrue_whenParamIsOk() { assertTrue(InfoHelper.method(Result.OK)) } @Test fun method_returnFalse_whenParamIsOtherStatus() { assertFalse(InfoHelper.method(Result.ERROR)) assertFalse(InfoHelper.method(Result.TIMEOUT)) } }
常见注意点
- 如果你之前在ViewModel测试里用MockK之类的框架Mock过
InfoHelper要注意:这类框架对Kotlin object的Mock是全局生效的,要是同模块下的测试没有做清理,会导致跑InfoHelper自身测试时,调用的是Mock出来的桩方法,不是真实业务逻辑。解决方法很简单,在之前Mock过InfoHelper的测试类里加测试结束回调解除Mock即可:@After fun tearDown() { unmockkObject(InfoHelper) } - 如果你的object方法里硬依赖了Android上下文、或者其他全局可变对象,最好把依赖改成参数传入的形式,不然本地单元测试跑的时候会因为找不到Android环境报错。用Robolectric或者测试替身替换依赖也能解决问题,但可注入的依赖写测试会省事很多。
内容的提问来源于stack exchange,提问作者VVB
相关产品推荐
相关产品推荐

