gpt4 book ai didi

android - 使用 Mockito 和 Kotlin 的 Base Presenter Test 类 - 解决通用类型删除

转载 作者:行者123 更新时间:2023-12-02 13:00:22 25 4
gpt4 key购买 nike

我正在尝试使用泛型编写一个基本测试类来减少样板代码。它专门用于测试(MVP)演示者,我正在使用 Mockito 来模拟 View 界面。例如。像这样的东西(简化):

abstract class BasePresenterTest<V: BaseView, P: BasePresenter<V>> {

@Mock
lateinit var mockView: V

lateinit var presenter: P

@Before
open fun setUp() {
MockitoAnnotations.initMocks(this)
}

// ...
}

这是一个问题,因为类型删除意味着 Mockito 无法模拟泛型参数中传递的具体 View 类型。尝试运行这样的测试将产生 java.lang.ClassCastException: BaseView$MockitoMock$1481956224 cannot be cast to ConcreteView在运行时。

我目前的解决方法是添加一个抽象函数来返回 View 类,以便可以直接在基类中模拟它:
abstract class BasePresenterTest<V: BaseView, P: BasePresenter<V>> {

lateinit var mockView: V

lateinit var presenter: P

abstract fun getViewClass(): Class<V>

@Before
open fun setUp() {
mockView = Mockito.mock(getViewClass())
}

// ...
}

这意味着具体测试类中有更多样板代码,这在某种程度上完全违背了基本测试类的目的。它也是泛型类型删除的经典 Java 解决方法。我想知道是否有更好的方法来使用 Kotlin 做到这一点? (我在想以某种方式具体化泛型类型参数,但它们只适用于内联函数。)

最佳答案

在 Kotlin 中想不出更好的方法,但我认为您应该重新考虑您的设计决策,并最终使用组合将您可能希望在不同演示者之间共享的任何代码移动到单独的类中。

为了仍然保持调用的便利性,您可以使这个公共(public)演示者类成为特定类的委托(delegate),如下所示:

class MyCommonPresenter : CommonPresenter {
...
}

class MySpecificPresenter internal constructor(common: CommonPresenter)
: CommonPresenter by common {
constructor() = this(MyCommonPresenter())
...
}

然后你只需为 MyCommonPresenter 编写一个测试并将其视为 MySpecificPresenter 的可模拟依赖项测试。

关于android - 使用 Mockito 和 Kotlin 的 Base Presenter Test 类 - 解决通用类型删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49193152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com