当前位置: 首页 > 知识库问答 >
问题:

使用Mockito和Kotlin的基本Presenter测试类-处理泛型类型擦除

上官景铄
2023-03-14
abstract class BasePresenterTest<V: BaseView, P: BasePresenter<V>> {

    @Mock
    lateinit var mockView: V

    lateinit var presenter: P

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

    // ...
}

我目前的解决方案是添加一个抽象函数来返回视图类,这样就可以直接在基类中模拟它:

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解决泛型类型擦除的方法。我在想有没有更好的方法来对付科特林?(我在考虑以某种方式具体化泛型类型参数,但它们只适用于内联函数。)

共有1个答案

万楷
2023-03-14

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

为了保持调用的便捷性,您可以将这个公共演示者类作为特定类的委托,如下所示:

class MyCommonPresenter : CommonPresenter {
    ...
}

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

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

 类似资料:
  • 考虑一个具有的API,如下所示: 很简单,只有页面大小和跳过计数属性。 此外,现在我还有一些类,它们也包含但未分页。 在我的测试中,我希望他们都能实现一个接口,这样我就可以用一些更基本的测试来生成一个通用的基本测试类。为此,我添加了我认为会起作用的内容: 我将PagedResults更改为: 错误 但现在编译器抱怨PagedResultBase继承的所有地方的使用情况(?)从。 但是,如果我将接口

  • 面对这一行代码,我感到非常困惑: 我知道什么

  • 我有一个带有泛型参数的抽象测试类。 我已经实现了它的一个具体测试类。 方法签名如下所示 当运行时,我得到一个说 为什么?我有什么办法可以解决这个问题吗?

  • 我有一个返回泛型的函数: 所以,当我试图匹配一个函数结果时,我的问题是: 我得到一个警告:“类型模式数组[CustomerInfo到[CustomerApplication到]]中的非变量类型参数CustomerApplication-DDTO未选中,因为它已被擦除消除。” 这是否意味着在Array[]中可以得到任何类型的数组?所以我已经阅读了关于ClassTag和TypeTag的文章,但是误解了

  • 主要内容:字面常量,比较两个数字,类型转换,位操作符,字符,布尔,数组,字符串,字符串模板Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。不同于 Java 的是,字符不属于数值类型,是一个独立的数据类型。 类型 位宽度 Double 64 Float 32 Long 64 Int 32 Short 16 Byte 8 字面常量 下面是所有类型的字面常量: 十进制:123 长整型以大写的 L 结尾:123L 16 进制以 0x 开头

  • Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。不同于Java的是,字符不属于数值类型,是一个独立的数据类型。 类型 位宽度 Double 64 Float 32 Long 64 Int 32 Short 16 Byte 8 字面常量 下面是所有类型的字面常量: 十进制:123 长整型以大写的 L 结尾:123L 16 进制以 0x 开头:0