java 如何在单元测试中模拟泛型类?

3pvhb19x  于 2022-11-20  发布在  Java
关注(0)|答案(2)|浏览(193)

我尝试在Kotlin中模拟MongoCollection类

class MyTest {

  val mockCollection: MongoCollection<Document> = mock(MongoCollection<Document>::class.java)

}

它给出了错误只允许类位于类文字的左侧
在研究了一点之后,我发现了这个only classes are allowed on the left hand side of a class literal,我尝试为MongoCollection创建一个类型,然后将其传递给mock,但由于mock的类型为Type,因此会出现错误。
我还尝试将mock转换为Document,如下所示

val mockCollection: MongoCollection<Document> = mock(MongoCollection::class.java) as MongoCollection<Document>

但在代码实现内部访问MongoCollection时会出现NullpointerException异常。
我已经试过了

两个都有同样的错误
我厌倦了用java写同样的测试,也厌倦了在其中转换泛型。

MongoCollection<Document> mockCollection = (MongoCollection<Document>) mock(MongoCollection.class);

有没有人有在Kotlin中嘲笑泛型类的经验?

zour9fqk

zour9fqk1#

我为你写了下面的例子:

interface Mosi<T> {
    fun mos(): T
}

则以下所有三个代码片段都可用于测试,并且测试通过:
第一个
如果你得到NPE,问题出在别的地方,也许提供更多的代码可以帮助!

4bbkushb

4bbkushb2#

溶液

在Mockito上创建一个扩展,如下所示:

inline fun <reified T: Any> mock() = Mockito.mock(T::class.java)

用法

使用扩展函数,如下所示:

val mockCollection = mock<MongoCollection<Document>>()

val mockCollection: MongoCollection<Document> = mock() // I prefer this one

我总是使用这个函数而不是原来的mock()函数,因为可以推断出java类。

离题

它甚至是伟大的嘲笑Lambdas!

val callback: () -> Unit = mock()

someClass.doSomething(callback)

verify(callback).invoke()

相关问题