【问题标题】:Mocked Object with Mockito Kotlin Not Stubbing Method使用 Mockito Kotlin Not Stubbing 方法模拟对象
【发布时间】:2023-04-08 22:25:01
【问题描述】:

我有以下代码:

@RunWith(MockitoJUnitRunner::class)
class OnboardingViewModelTest {

    @Mock lateinit var authService : AuthService
    lateinit var internetProvider: InternetStatusProvider
    private lateinit var viewModel: OnboardingViewModel

    @Before
    fun setup() {
        internetProvider = mock()
        whenever(internetProvider.hasInternet()).thenReturn(true)
    }

InternetStatusProvider 的构造函数如下所示:

InternetStatusProvider(context:Context)

在对internetProvider.hasInternet() 方法进行存根时,我得到了一个NullPointerException,因为该方法的实现使用了在构造函数中传递的context,并且正在调用真正的方法?

我在这里缺少什么?关键是要对这个方法的真正实现存根?

【问题讨论】:

  • hasInternet() 函数的签名是什么?如果不是open,则调用internetProvider.hasInternert() 将被执行,因为Mockito 无法存根最终方法。
  • 天才,我猜应该很明显。所以需要打开存根方法......不确定我喜欢这个。请将此作为答案提交,我会接受。

标签: android mockito kotlin


【解决方案1】:

Mockito 不能存根 final 方法。如果您尝试从模拟实例执行最终方法,则将执行真实代码。由于 Kotlin 的函数默认为 final,因此您必须在函数中添加 open 修饰符。

Mockito 中还有一个incubating feature确实允许模拟最终的类和方法,这可能值得一看。

【讨论】:

  • Here's 一种开始使用 Mockito 内联版本的简单方法。
猜你喜欢
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 2011-09-25
相关资源
最近更新 更多