Android Mockito -模拟函数返回值

db2dz4w8  于 2022-11-08  发布在  Android
关注(0)|答案(1)|浏览(210)

业余的问题,但我似乎找不到答案...
我正在使用Mockito编写单元测试,我有一个utils函数(isOnline(context)),它在进行网络调用之前检查我是否脱机。
我并不想测试该函数,所以我想模拟该函数的结果,而不运行其中的任何代码。
我已经尝试了两种常用的方法:

  • given(isOnline(context)).willReturn(true)
  • when(isOnline(application)).thenReturn(true)

但两者似乎都在运行isOnline方法。

fun isOnline(context: Context): Boolean {
  val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
...
}

...我收到错误

java.lang.NullPointerException: null cannot be cast to non-null type 
 android.net.ConnectivityManager
    at org.triggerise.base.utils.NetworkUtilsKt.isOnline(NetworkUtils.kt:14)

对于如何只模拟结果而不运行方法的内容,有什么建议吗?

qlzsbp2j

qlzsbp2j1#

这就是Java/Kotlin的工作方式--你实际上是在模拟那里的行为的同时调用方法,所以代码被执行。要解决这个问题,你需要使用doReturn(文档中的第12节)Mockito方法。

doReturn(false).when(mockedObject).isOnline(context)

如果方法是静态的,则必须使用mockStatic方法(文档中的第48节)。

try (var mockedStatic = Mockito.mockStatic(YourClass.class) {
    mockedStatic.when(() -> YourClass.isOnline(...)).thenReturn(false);

    // rest of the test 
}

相关问题