首页 > 解决方案 > 如何为安卓假测试创建可互换的类类型?

问题描述

我正在尝试为我的存储库创建一个假类来测试视图模型。

据我了解,这里的关键元素是创建两个具有公共接口的类,以便两个类包含相同的方法。问题是我在尝试初始化对象时遇到类型不匹配。我试图以一种简化的方式做同样的事情:

class fakeClass1 : fakeInterface {
override fun getAllData(): String {
    return ""
}}}


class fakeClass2 : fakeInterface {
override fun getAllData(): String {
    return ""
}}

interface fakeInterface {
fun getAllData(): String}

val fakeClass: fakeClass1 = fakeClass2()

但这也没有用。我错过了什么?

标签: androidunit-testingkotlinviewmodel

解决方案


我认为你已经解决了,但只是为了让你清楚(这是一件重要的、基本的事情!)

val fakeClass: fakeClass1 = fakeClass2()

这是定义一个名为的变量,该变量fakeClass引用具有该fakeClass1类型的对象。然后你分配一个具有该fakeClass2类型的对象。

但是 afakeClass2 不是a fakeClass1,也不是另一个的超类,所以你不能把一个当作另一个。您的示例很简单,但想象一下您添加coolFunction()fakeClass1- 它们现在碰巧具有不同的结构,并且尝试在没有它的对象上调用该方法会导致崩溃。

这些类的唯一共同点是它们都具有fakeInterface类型-它们 fakeInterfaces,并且保证它们实现了该接口中的东西(getAllData在这种情况下是您的函数)。因此,如果您将它们都视为该类型:

val fakeClass: fakeInterface = fakeClass2()

您可以使用其中任何一个,因为它们都是fakeInterfaces(类似于Ints 和Doubles 的不同之处,但它们都是Numbers)。因为fakeClass现在是 a fakeInterface,所以您只能访问 a 具有的函数和属性——即使您碰巧传入了 a ,fakeInterface也无法调用,因为没有。coolFunction()fakeClass1fakeInterface

(您可以将变量转换为fakeClass1,基本上是说“哦,顺便说一下,这个对象实际上也是这种类型”,但此时类型系统不能保证您是正确的,除非您明确检查fakeClass is fakeClass1,并且它'如果是这种情况,我会警告你)

Java 教程非常好,它们将为您概述每种类型如何形成您使用的一种“合同”


推荐阅读