android - 如何为安卓假测试创建可互换的类类型?
问题描述
我正在尝试为我的存储库创建一个假类来测试视图模型。
据我了解,这里的关键元素是创建两个具有公共接口的类,以便两个类包含相同的方法。问题是我在尝试初始化对象时遇到类型不匹配。我试图以一种简化的方式做同样的事情:
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()
但这也没有用。我错过了什么?
解决方案
我认为你已经解决了,但只是为了让你清楚(这是一件重要的、基本的事情!)
val fakeClass: fakeClass1 = fakeClass2()
这是定义一个名为的变量,该变量fakeClass
引用具有该fakeClass1
类型的对象。然后你分配一个具有该fakeClass2
类型的对象。
但是 afakeClass2
不是a fakeClass1
,也不是另一个的超类,所以你不能把一个当作另一个。您的示例很简单,但想象一下您添加coolFunction()
了fakeClass1
- 它们现在碰巧具有不同的结构,并且尝试在没有它的对象上调用该方法会导致崩溃。
这些类的唯一共同点是它们都具有fakeInterface
类型-它们是 fakeInterface
s,并且保证它们实现了该接口中的东西(getAllData
在这种情况下是您的函数)。因此,如果您将它们都视为该类型:
val fakeClass: fakeInterface = fakeClass2()
您可以使用其中任何一个,因为它们都是fakeInterface
s(类似于Int
s 和Double
s 的不同之处,但它们都是Number
s)。因为fakeClass
现在是 a fakeInterface
,所以您只能访问 a 具有的函数和属性——即使您碰巧传入了 a ,fakeInterface
也无法调用,因为没有。coolFunction()
fakeClass1
fakeInterface
(您可以将变量转换为fakeClass1
,基本上是说“哦,顺便说一下,这个对象实际上也是这种类型”,但此时类型系统不能保证您是正确的,除非您明确检查fakeClass is fakeClass1
,并且它'如果是这种情况,我会警告你)
Java 教程非常好,它们将为您概述每种类型如何形成您使用的一种“合同”
推荐阅读
- python-3.x - 在 smtplib 上使用变量
- swift - USDZ 文件无法在 QuickLook 应用中打开
- c++ - 如何创建 IDWriteTextLayout4?
- xslt-1.0 - 对嵌套 XML 中的特定节点进行排序
- javascript - 带有 TCP 和 UDP 的库 JS 以及用于 Firefox 和 Chrome 的 WebExtension
- php - MySQL在输入日期后删除
- java - 在wildfly服务器上部署时找不到实现ServletContextListener(AppContextListener)的类
- javascript - Need multi select checkbox drop-down, when option selected textbox should be displayed beside option in same drop-down
- moodle - Moodle 附加的 HTML 代码不能正常工作
- python - if 条件基于读取 paramiko 通道缓冲区