具有延迟加载功能的 ViewModel 类的单元测试

2024-03-09

我正在尝试为具有延迟加载的 viewModel 类编写单元测试。我有以下 ViewModel 类:

abstract class DetailViewModel(item: TmdbItem) : BaseViewModel() {

    private val _trailers = MutableLiveData<List<Video>>()
    val trailers: LiveData<List<Video>>
        get() = _trailers

    private val _cast: MutableLiveData<List<Cast>> by lazy {
        MutableLiveData<List<Cast>>().also {
            arrayOf(composeObservable { getTrailers(item.id) }
                    .subscribe({ videos ->
                        _trailers.postValue(videos)
                    }) { throwable -> Timber.e(throwable) }
                    , composeObservable { getCast(item.id) }
                    .subscribe({ cast ->
                        _cast.postValue(cast)
                    }) { throwable -> Timber.e(throwable) }).also { compositeDisposable.addAll(*it) }
        }
    }
    val cast: LiveData<List<Cast>>
        get() = _cast

    protected abstract fun getTrailers(id: Int): Observable<List<Video>>

    protected abstract fun getCast(id: Int): Observable<List<Cast>>
}

我为其编写了一个单元测试,如下所示:

RunWith(MockitoJUnitRunner::class)
class DetailViewModelTest {

    @get:Rule
    var rule: TestRule = InstantTaskExecutorRule()

    @Mock
    private lateinit var api: TmdbApi

    @Test
    fun loadTrailersAndCast() {
        val observableResponseVideo = Observable.just(TmdbApi.VideoWrapper(
                listOf(Video("id", "name", "site", "key", 20, "type"))))
        `when`(api.movieTrailers(1)).thenReturn(observableResponseVideo)

        val observableResponseCast = Observable.just(TmdbApi.CastWrapper(
                listOf(Cast("char", "name", null, 1))))
        `when`(api.movieCast(1)).thenReturn(observableResponseCast)

        val viewModel = MovieDetailViewModel(api, Movie(1, "overview", "2012", null,
                null, "title", 9.0))

        val observer = LoggingObserver<List<Cast>>()
        viewModel.cast.observeForever(observer)

        val observer2 = LoggingObserver<List<Video>>()
        viewModel.trailers.observeForever(observer2)

        with(observer.value) {
            assertThat(this, `is`(notNullValue()))
            assertTrue(this!!.isNotEmpty())
            assertThat(this.size, `is`(1))
        }

        with(observer2.value) {
            assertThat(this, `is`(notNullValue()))
            assertTrue(this!!.isNotEmpty())
            assertThat(this.size, `is`(1))
        }
    }

    /**
     * simple observer that logs the latest value it receives
     */
    private class LoggingObserver<T> : Observer<T> {
        var value: T? = null
        override fun onChanged(t: T?) {
            this.value = t
        }
    }
}

当我执行测试时,我收到以下错误:

*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844



java.lang.StackOverflowError
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at io.reactivex.Observable.subscribe(Observable.java:12034)
    at io.reactivex.Observable.subscribe(Observable.java:12016)
    at io.reactivex.Observable.subscribe(Observable.java:11945)
    at com.sample.android.tmdb.ui.detail.DetailViewModel$_cast$2.invoke(DetailViewModel.kt:25)
    at com.sample.android.tmdb.ui.detail.DetailViewModel$_cast$2.invoke(DetailViewModel.kt:12)
    at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
    at com.sample.android.tmdb.ui.detail.DetailViewModel.get_cast(DetailViewModel.kt)
    at com.sample.android.tmdb.ui.detail.DetailViewModel.access$get_cast$p(DetailViewModel.kt:12)
    at com.sample.android.tmdb.ui.detail.DetailViewModel$_cast$2$$special$$inlined$also$lambda$4.accept(DetailViewModel.kt:26)
    at com.sample.android.tmdb.ui.detail.DetailViewModel$_cast$2$$special$$inlined$also$lambda$4.accept(DetailViewModel.kt:12)

你知道我该如何解决该错误吗?

您可以在以下位置找到完整的源代码:https://github.com/AliRezaeiii/TMDb-Paging https://github.com/AliRezaeiii/TMDb-Paging


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有延迟加载功能的 ViewModel 类的单元测试 的相关文章

  • Visual Studio 不允许我在 Android 物理设备上进行调试

    我正在使用 Xamarin 和 Visual Studio 2013 开发 Android 应用程序 我已将 Android 小程序连接到计算机 Sansung Kies 识别了该设备 Adb 也能识别它 因为当我输入 adb device
  • 单击 RecyclerView 内的 ImageView 时更改图像资源

    每当我单击它时 单击图像 而不是项目 我都会尝试更改回收器视图内特定位置的设备图像资源 我尝试将 setOnClickListener 放入 onBindViewHolder 方法中 但只有最后一个项目受到影响 这是我的回收者视图 http
  • 我可以在 firebase android 中加载另一个用户个人资料图像吗?

    如果我有其他用户的电子邮件但我以其他用户身份登录 我是否可以加载其他用户的个人资料图像 如果您使用 Firebase Storage 那么从技术上讲是的 它只是一个您可以从中检索任何文件的文件系统 如果不伪造您的应用程序 获取 api 密钥
  • 应用程序实例是否始终在任何活动之前创建?

    在 Android 中 您可以通过扩展 Application 类并在 Manifest 中声明名称来提供您自己的 Application 类实现 我的问题是 这个实现是否总是在初始活动之前创建 或者活动可以在应用程序实例有时间创建之前启动
  • Android Studio - 错误:未捕获翻译错误:com.android.dx.cf.code.SimException:本地 0001:无效

    我刚刚使用 Android Studio 设置了一台新计算机 并从 bitbucket 导入了我的项目 问题是我现在在尝试构建项目时遇到此错误 信息 Gradle 任务 app clean app generateDebugSources
  • 如何将 EditText 传递给另一个活动?

    Intent intent new Intent this Name class intent putExtra key et getText toString startActivity intent Intent intent getI
  • Google Firebase - 如何删除崩溃报告?

    我最终失明了吗 还是没有明显的方法可以通过 Google Firebase Web 控制台删除 Firebase 崩溃报告 我的 Android 应用程序已成功记录报告 但现在出现大量 开发崩溃 占用了我在控制台中的大部分视图 这使得找到实
  • Android-工具栏中的SearchView

    我只想在我的应用程序中添加 searchview 但我不想搜索任何东西 只是我想要用户输入的查询 到目前为止 我尝试了这段代码 但是当我运行我的应用程序时它崩溃了 Update 我尝试了这个 但即使我的应用程序崩溃了 main menu x
  • 使用 Android 播放任意音调

    有没有办法让Android发出任意频率的声音 意思是 我不想预先录制声音文件 我环顾四周 音调发生器 http developer android com reference android media ToneGenerator html
  • SQLite支持android的数据类型有哪些

    谁能告诉我 SQLITE 中支持 ANDROID 的数据类型列表 我想确认 TIME 和 DATE 数据类型 这里有一个list http www sqlite org datatype3 htmlSQLite 的数据类型 支持时间和日期间
  • Android Studio - 如何关闭“单词‘word’中的拼写错误?”

    当命名变量或给出字符串参数时 Android Studio 似乎对我如何标记事物有问题 有办法把它关掉吗 是的 打开Preferences gt Editor gt Inspections gt Spelling gt 关闭Typo并按OK
  • 加快 ImageView 中的缩放功能

    我目前正在处理非常大的图像 7 10mb 由于多种原因无法调整大小或压缩 现在 我们的想法是在自定义 ImageView 中显示它们 使用户能够进行双击缩放 捏合缩放等 我使用这个库来完成这项工作 https github com Mike
  • Android 改变 ImageView / Bitmap 的颜色

    我需要找到一种方法来改变 Android 中位图的颜色 我需要在我的应用程序中平滑地替换 更改椭圆形图像的颜色 具体取决于int价值 我需要类似的东西myValue 5比改变我的图像的颜色RED and if myValue 322将颜色更
  • 如何在android中的操作栏中创建Edittext?

    我们可以在操作栏中使用编辑文本吗 在阅读了 Google 中的大量资源后 我找不到如何在操作栏中创建编辑文本 谁能告诉我该怎么做 您可以设置自定义View为了ActionBar像这样 getActionBar setCustomView R
  • jar 中的 apklib 有什么优点?

    我正在关注这个问题 https stackoverflow com questions 6059502 whats the difference between apklib and jar files但它并没有完全回答我的问题 jar 中
  • android 中camera.setParameters 失败

    我已将相机功能包含在我的应用程序中 我还在市场上推出了该应用程序 我从一位用户那里收到一条错误消息 称他在打开相机时遇到错误 我已经在 2 1 的设备上测试了该应用程序 我从用户那里得到的错误是使用 Nexus One 它主要运行 2 2
  • 如何从 Facebook 邀请好友到 Android 应用程序? - 给出错误

    我正在开发一个 Android 应用程序 我正在努力将 邀请朋友 功能添加到我的应用程序中 它转到我的AppLinkUrl成功但显示错误 我的清单代码如下
  • 检测 ListView(或 ScrollView)内的滚动位置

    我正在构建一个聊天室应用程序 其中每 X 秒就会轮询一次新事件 每次发生这种情况时 此代码都会使用新数据更新 RoomAdapter ArrayAdapter 的自定义子类 并将其滚动到底部 RoomAdapter adapter Room
  • 在 Android 中上传文件出现内存不足错误

    我的上传代码如下 String end r n String twoHyphens String boundary try URL url new URL ActionUrl HttpURLConnection con HttpURLCon
  • 异步更新后更新Android Listview

    我正在将 HTTP 调用从同步调用转换为异步调用 由于连接在后台运行 因此当我最初设置列表适配器时 数据不存在 如何在 HTTP 调用后更新列表适配器 我尝试了一些方法 例如在数据发送回之前不设置适配器并再次设置适配器 但没有任何效果 这是

随机推荐

  • 另一种 Quantmod ZigZag 叠加

    我目前正在使用quantmodZigZag 叠加 我注意到它的计算方式与原始叠加有点不同 我已经证明了以下差异picture https i stack imgur com YER0M gif使用 ZigZag 5 的 RDWRquantm
  • 如何在没有第一次提交的情况下撤消 git rm -rf dirname ?

    I did git init git add git rm rf dirname 看了其他答案 git reset hard HEAD git checkout f and git reflog不起作用 显然是因为没有可以返回的 HEAD
  • 如何在同一页面切换多个react组件

    我有一个使用 Material ui 列表构建的用户仪表板 对于每个 listItem 我都有一个组件 我想要的是 当我单击列表元素时 有一个专门用于切换组件的部分 我在实现这个时遇到困难 这是我的代码 我不知道该放在哪里onClick处理
  • SecurityException:权限拒绝:通过显式意图启动 Activity 时

    我正在读关于在活动中声明权限 https developer android com guide components activities intro activities dp 根据文档 您可以使用清单的标签来控制哪些应用程序可以启动特
  • 在 QVBoxLayout 中查找选中的 QRadioButton

    我使用下面的代码动态创建一组单选按钮 self wPaymantType qgbSomeSelectionGroup QtGui QGroupBox vbox QtGui QVBoxLayout for row in listOfChoic
  • 使用VB.Net获取图像宽度和高度

    在 VB net 中 我需要读取一个充满图像的文件夹并获取它们 文件名 像素高度和像素宽度 并将它们的值分配给各个变量 thanks Mike 尝试这个 Imports System IO Imports System Drawing Mo
  • cmdline-tools:无法确定 SDK 根目录

    C Android sdk bin gt sdkmanager错误 无法确定 SDK 根目录 错误 要么明确指定它 sdk root 或将此包移动到预期位置
  • 从两个向量(名称、值)创建命名列表

    有没有办法在两个向量上使用 mapply 来构造命名列表 第一个向量的类型为character并包含用于列表的名称 而第二个包含值 到目前为止 我唯一的解决方案是 gt dummyList list gt addToList lt func
  • 流星没有开始

    我在启动 Meteor 示例时遇到问题 这就是我打字时得到的meteor在应用程序文件夹中 parties Unexpected mongo exit code 100 Restarting Unexpected mongo exit co
  • 使用 Phonegap 和 AngularJS 的 HTML5 模式

    我正在尝试使 AngularJS html5 模式 true 与 Phonegap 一起使用 我之前做了很多搜索来发布这个 我尝试了不同的组合 配置 在元中添加 标签 也尝试使用 和 添加 html 后缀到路由端点 在 config 块内添
  • 如何选择每月最高消费客户

    我有一个列出日期 customerID orderID 和 orderCost 的视图 如何选择每月最高消费客户 该数据仅涵盖2015年的六个月时间 我能够获得每个客户每月花费的总和 但不能获得最大支出客户 SELECT EXTRACT Y
  • 独立的 getter/setter 方法,还是组合的?

    在处理一个项目时 我一直在进行一些更改并浏览现有框架 API 文档以获取见解 在仔细阅读 Kohana 文档时 我注意到任何给定类的 getter setter 通常都是组合在一起的 public function someProperty
  • iOS拍照倒放的处理方法

    我在网站上使用输入字段 以便用户可以给自己拍照 在 iPad iPhone 上 生成的图片是颠倒的 如何轻松检测用户是否使用相机 以便我通过 Javascript 旋转图像 之后我在 Javascript Canvas 中使用该图片 我得到
  • 使用通用通配符代替接口

    如果你想存储类型的对象数组MyInterface 以下两种形式都可以接受吗 如果可以的话 您什么时候会使用第二种形式而不是第一种形式 i 仅使用一个接口 List
  • Matplotlib 绘图窗口未使用 command-w 关闭

    我在我的Mac上使用ipython3 版本如下 Python 3 5 2 Anaconda custom x86 64 default Jul 2 2016 17 52 12 and matplotlib版本2 0 0 我改变了后端maco
  • 哎呀!使用保留字来命名列

    我制作了一个 bigquery 表 其中有一列名为 row 无引号 doh 现在 如果我引用该列 我的 sql 将无法编译 SELECT row etext FROM hcd hdctext LIMIT 1 ERROR 我没有看到 ROW
  • 如何在Java中使用snake yaml序列化具有自定义名称的字段

    我正在尝试序列化具有如下字段的 Java 实例 public class Person private String firstName private String lastName public String getFirstName
  • shell脚本中的三重嵌套引号

    我正在尝试编写一个 shell 脚本来调用另一个脚本 然后执行 rsync 命令 第二个脚本应该在它自己的终端中运行 所以我使用gnome terminal e 命令 该脚本的参数之一是一个字符串 其中包含应提供给 rsync 的参数 我把
  • 在 Xamarin 应用程序中将项目添加到 Android 上的 ListView

    我正在尝试重新混音将项目添加到 ListView 的基本 Android 建议 https stackoverflow com q 4540754 419956在 Xamarin 应用程序中 但到目前为止我失败了 在 Xamarin Stu
  • 具有延迟加载功能的 ViewModel 类的单元测试

    我正在尝试为具有延迟加载的 viewModel 类编写单元测试 我有以下 ViewModel 类 abstract class DetailViewModel item TmdbItem BaseViewModel private val