1

我在这里读过。这与我的问题很接近,我需要更多关于这部分的指导。

鉴于,

class Journey{
    fun start(){
        Service.getInstance().getProductInfo(activity,object: Service.Callback<Product>{
            override fun onSuccess(data: Product) {
                showProductInfo(activity, data, customer)
            }

            override fun onError(e: Throwable) {
                showError(e)
            }
        })
    }

}

我想模拟 Service.getProductInfo 并执行快乐路径和不快乐路径处理,我该如何使用 mockk 呢?

附加问题,有没有办法在 jacoco 中排除某些功能,如 start 以上?有时某些函数对单元测试没有太大意义,在 jacoco 中排除它更有意义。

更新:

我从 Gradle 网站了解到,它目前不支持方法排除。

回调接口如下

interface Callback<T>{
   fun onSuccess(data: T)
   fun onError(e: Throwable)
}

我正在使用改造服务。

4

1 回答 1

0

首先,您不想将您的代码排除在代码覆盖率检查之外,因为它是您自己的代码并且必须进行测试。

对于主要问题。在这种特殊情况下(主要是因为我根本不会使用这种设计),我将采用能够首先模拟 getInstance 方法的方式,因此它会返回您想在测试中使用的任何模拟。首先想到的是使用 PowerMockito(或类似的模拟框架)。PowerMockito 允许您模拟静态方法(请参阅https://github.com/powermock/powermock/wiki/mockstatic)或者,这在我看来有点糟糕,但完全取决于您)在工厂方法中模拟对象的构造与https://github.com/powermock/powermock/wiki/MockConstructor

我最不喜欢的方法(如果你不能在你的代码中使用 PowerMock)这样做(据我所知它是 Service 类的静态方法)可以在这里找到:https ://hackernoon.com/mocking-static-method -in-kotlin-614df89482ae 这很简单,但您需要重写代码才能使用它。但是如果可以重写您的代码,最好重新设计它以使其更具可测试性。

编辑:刚刚意识到你需要用 mockk 来做。我对它并没有真正的经验,但是 AFAIK 它与 staticMockk 具有几乎相同的功能。你可以看到这个问题来检查它:Mock static java methods using Mockk

于 2019-06-24T09:40:56.693 回答