采用koin 依赖注入进行viewmodel单元测试

Koin 依赖注入在 Android 项目中的应用实践与最佳实践 在 Android 应用开发中,随着项目规模的不断扩大、业务逻辑的逐步复杂,如何管理组件之间的依赖关系成为极为关键的问题。依赖注入(Dependency Injection,DI)作为一种软件设计模式,通过将依赖关系交给框架去管理,能够极大降低代码之间的耦合度,提高代码的测试性和可维护性。如今在 Android 平台上,众多 DI 框架涌现,其中 Koin 以其轻量、简单、无注解的特点受到越来越多开发者的青睐。本文将详细讲解如何在 Android 项目中运用 Koin,从基础理论到实际案例,从最佳实践到调试 阅读详情
koin = "3.6.0-Beta4"
koinComposeMultiplatform = "1.2.0-Beta4"
truth = "1.0.1"
mockito = "2.21.0"
mockk = "1.13.2"
kotinx="1.7.0"



koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" }
koin-compose = { module = "io.insert-koin:koin-compose", version.ref = "koinComposeMultiplatform" }
koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koinComposeMultiplatform" }

kotlinx-coroutines={module = "org.jetbrains.kotlinx:kotlinx-coroutines-test",version.ref="kotinx"}
kotlin-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" }
koin-test = { module = "io.insert-koin:koin-test", version.ref = "koin" }
koin-test-junit4 = { module = "io.insert-koin:koin-test-junit4", version.ref = "koin" }

google-truth = { module = "com.google.truth:truth", version.ref = "truth" }
mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" }
mockk = { module = "io.mockk:mockk", version.ref = "mockk" }

添加依赖

  val desktopTest by getting
        desktopTest.dependencies {
            implementation(libs.kotlin.test)
            implementation(libs.koin.test)
            implementation(libs.koin.test.junit4)
            implementation(libs.kotlinx.coroutines)
            implementation(libs.google.truth)
            implementation(libs.mockito.core)
            implementation(libs.mockk)
        }

以登录测试为例

测试class要继承 KoinTest

class LoginByPwdOrCardViewModelTest : KoinTest {}

在测试开始时,对koin进行初始化

    @BeforeTest
    fun setUp() {
        initTestKoin()
    }

InitKoin.kt
fun initTestKoin(config: KoinAppDeclaration? = null) {
    startKoin {
        config?.invoke(this)
        modules( testModule, viewModelModule)
    }
}



Modules.kt

val testModule = module {
    singleOf(::TestDeskTopRepository).bind<DeskTopRepository>()
}


val viewModelModule= module {
//    viewModelOf(::LoginByPwdOrCardViewModel)\
    factory { LoginByPwdOrCardViewModel(get()) } //每次都是重新生成

}

桌面开发的viewmodel 和Android的viewmodel 创建方式不一样,Android有屏幕旋转,生命周期等感知

结束清理工作


    @AfterTest
    fun tearUp() {
        stopKoin()
    }

这样就可以通过注入的方式初始化viewmode

 private val viewModel by inject<LoginByPwdOrCardViewModel>()

做几个测试示例

 @Test
    fun testNeedAdminNormalUser_emitError() = runTest {
        viewModel.needAdmin.value = true//需要管理员权限
        viewModel.accountInputState.value = "linlian"
        viewModel.passwordInputState.value = "2"
        viewModel.loginByAccount()
        val event = viewModel.error.first() //shareflow 会阻塞等待
        assertThat(event.getContentIfNotHandled()?.status).isEqualTo(Status.ERROR)
    }

    @Test
    fun testLoginValidUser_emitError() = runTest {
        viewModel.accountInputState.value = "Invalid"
        viewModel.passwordInputState.value = "2"
        viewModel.loginByAccount()
        val event = viewModel.error.first() //shareflow 会阻塞等待
        assertThat(event.getContentIfNotHandled()?.status).isEqualTo(Status.ERROR)
    }

    @Test
    fun testNeedAdminAdminUser_userInfoNotNull() = runTest {
        viewModel.needAdmin.value = true//需要管理员权限
        viewModel.accountInputState.value = "Admin"
        viewModel.passwordInputState.value = "2"
        val job = viewModel.loginByAccount()
        job.join()
        val userInfo = LoginUserUtils.userInfoFlow.first() //stateflow不会阻塞等待
        assertThat(userInfo).isNotNull()
    }

Kotlin开发者必看:如何用Koin在5分钟内搞定MVVM依赖注入? 本文为Kotlin开发者详细介绍了如何使用轻量级依赖注入框架Koin,在5分钟内快速搭建Android MVVM架构的依赖注入体系。通过DSL驱动的简洁语法,无需代码生成即可高效管理ViewModel、Repository等各层依赖,显著提升开发效率和代码可测试性。 阅读详情

相关推荐

从‘眼花缭乱’到‘心中有数’:rs-fMRI统计分析全流程避坑指南(附DPABI操作截图)

本文详细解析了rs-fMRI统计分析的全流程,从质量控制到统计模型选择,再到多重比较校正和结果解读。特别针对DPABI软件操作中的常见陷阱提供实用指南,帮助研究者避免FDR和GRF校正等关键环节的错误,实现从数据混乱到清晰分析的转变。

weixin_33686714的博客 400

在Android Compose 中使用 Koin 进行依赖注入

其实在 Compose 工程中,Koin 只是简单的增加了一些特殊的注入方法,帮助我们更好的管理和使用注入对象,好了,到此为止 Koin 在 Compose 中如何使用依赖注入已经介绍完了,大家感兴趣的可以在 Demo 中体验体验下 Koin 的魅力!

m0_59162559的博客 1099

QFN封装芯片手工焊接实战:从焊盘处理到拖焊技巧

本文详细介绍了QFN封装芯片手工焊接的全过程,从焊盘处理到拖焊技巧,再到常见问题的现场修复方法。通过实战经验分享,帮助工程师和DIY爱好者掌握0.5mm小间距QFN芯片的焊接技术,提升焊接成功率和质量。重点讲解了垂直与平行拖焊手法的对比应用,以及焊后清理与质量检验的关键步骤。

weixin_42652674的博客 532

使用 koin 作为 Android 注入工具,真香

koin 为 Android 提供了简单易用的 API 接口,让你简单轻松地接入 koin 框架。

嘴巴吃糖了 1394

F5 shape最新版逆向分析(美西南、xbk)

本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,如有侵权,请联系作者立即删除。今天来简单秀下传说中的f5 shape,这是一个数一数二的盾,jsvmp+顶级风控,就算技术实力再强,也是需要花很多时间去摸索的,如果您遇到了这个盾又没有太多的时间去搞,欢迎来找我们。

mature的博客 3658

CST实战:变容二极管电容曲线提取全流程(附S参数设置技巧)

本文详细介绍了在CST Studio Suite中提取变容二极管电容-电压(C-V)曲线的完整实战流程。重点解析了S参数仿真的核心原理、DCFEED模块的正确配置、参数扫描的设置技巧,并探讨了集成SPICE模型进行精确仿真的方法,帮助射频工程师高效、准确地获取器件关键特性。

weixin_29237635的博客 529

在 Compose 中使用 Koin 进行依赖注入

实用的Kotlin和Kotlin多平台依赖注入框架 **Android Studio环境为** **Android Studio Flamingo | 2022.2.1**

m0_56255097的博客 625

Oracle EBS财务模块(三)总账功能

(一)总账管理系统主要功能  总账管理系统(Oraclegeneralledger)是一个公司一切账务系统的核心,它好比是公司会计信息的中央处理器。总账管理系统提供了一个完整的财务管理核算及分析流程。它是所有子账户的信息存储器,因此反映了所有子账户的财务和现金活动。总账管理系统的主要作用是记录公司的财务活动,并生成财务报表和管理报表,以帮助公司内外人士进行决策。一个公司或组织的制造系统、项目管理系

苏南生的优快云博客 2万+

Android Kotlin 依赖注入全解:Koin appModule 配置与多 ViewModel 数据共享实战指南

appModule是 Koin 依赖注入框架中的核心配置模块,用于集中管理应用中的所有依赖项。它本质上是一个 Koin 模块(),通过 DSL 方式声明各种组件的创建方式和依赖关系。

tangweiguo03051987的博客 2062

基于STM32L4XX、HAL库的IP101GRI以太网收发器(PHY)驱动程序设计

define IP101GRI_PHY_ADDRESS 0x01 // 根据硬件设计设置PHY地址。#define IP101GRI_PHYSTS 0x10 // PHY状态寄存器。#define IP101GRI_PHYINIR 0x12 // PHY中断寄存器。#define IP101GRI_PHYCR 0x14 // PHY控制寄存器。#define IP101GRI_PHYID2 0x03 // PHY标识符2。

zhusl6688的博客 722

uniapp [微信小程序] - 详解微信小程序端接入mqtt全流程及示例源码教程,uniApp微信小程序端如何接入MQTT插件并实现连接/断开+发布订阅+消息队列+离线重连等各种示例代码(开箱即用)

uniapp微信小程序接入MQTT,uniapp中使用mqtt,uniapp 微信小程序端接入mqtt示例代码教程,适用于微信小程序的MQTT插件,uniapp开发微信小程序连接mqtt,uniApp微信小程序接入MQTT协议,uniapp vue3微信小程序使用MQTT的小例子接入流程,使用uniapp开发小程序接入mqtt,如何在uniapp项目中使用mqtt,uniapp mqtt的使用示例,mqtt连接报错,如何在项目里集成mqtt,Mqtt协议,主动连接mqtt,订阅消息,实现发布,订阅和接收消息

🏆 前端领域优质创作者 2884

Retrofit+Jetpack(LiveData,Lifecycles,ViewModel,Room)+koin构建Android 官方的推荐架构指南MVVM架构

我们先参考一下官方的sunflower项目 先来俩按钮: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"

Sir的专栏 1274

【Python LeetCode 专题】面试经典 150 题

面试经典 150 题

一杯水果茶!足矣~ 1176

MovieHunt依赖注入实战:使用Koin管理Android应用组件

MovieHunt是一款使用Kotlin编写的Android电影应用,采用MVVM架构,结合了RxJava、Android Architecture Components和协程等现代技术。本文将详细介绍如何在MovieHunt项目中使用Koin实现依赖注入,帮助开发者更好地管理应用组件,提升代码的可维护性和可测试性。 ## 为什么选择Koin进行依赖注入? 在Android开发中,依赖注入是一

gitblog_00738的博客 694

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

告别模板代码:Koin让Android ViewModel注入像呼吸一样自然

你是否还在为Android ViewModel的依赖注入编写大量模板代码?是否在处理ViewModel与Activity/Fragment生命周期同步时感到头疼?本文将带你用Koin实现ViewModel的优雅注入,从基础配置到高级技巧,让依赖管理变得简单直观。读完本文,你将掌握ViewModel注入的完整流程、参数传递技巧、跨组件共享方案以及SavedStateHandle集成方法。 ## K

gitblog_01072的博客 1110

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

如何使用 Koin 框架轻松实现 UserRepository 依赖注入

Koin 是一个实用的轻量级依赖注入框架,专为 Kotlin 和 Kotlin Multiplatform 设计。它提供了简单直观的方式来管理应用程序中的依赖关系,让开发者能够更专注于业务逻辑的实现而非繁琐的对象创建和管理。本文将详细介绍如何在项目中使用 Koin 实现 UserRepository 的依赖注入,帮助你快速掌握这一强大工具的核心用法。 [![Koin 框架 logo](https

gitblog_00196的博客 306

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Gemma许可证与合规要点:MiLMMT-46-12B-v0.1-6bit商用边界你必须知道

MiLMMT-46-12B-v0.1-6bit 是小米 46 语种机器翻译模型的 MLX 6-bit 量化版,采用 Google 的 Gemma 许可证分发。它不是常见的 Apache 2.0 或 MIT 协议,商用时存在明确的"红线"。本文用大白话讲清 Gemma 许可证的合规要点,帮你安全、放心地把这个翻译模型用进产品。 ## 先搞清楚:Gemma 许可证到底是什么? 核心结论:**MiL

gitblog_00598的博客 320

Koin与Material Design 3完美融合:现代Android UI组件的终极依赖注入指南

Koin是一个实用的轻量级依赖注入框架,专为Kotlin和Kotlin Multiplatform设计。本文将详细介绍如何将Koin与Material Design 3无缝集成,打造现代化的Android UI组件,让你的应用开发更加高效和优雅。 [![Koin框架logo](https://raw.gitcode.com/gh_mirrors/ko/koin/raw/461b5684684bb

gitblog_00079的博客 795

Koin实战:用Kotlin DSL简化MVVM架构的依赖注入

本文详细介绍了如何使用Koin依赖注入框架及其Kotlin DSL特性,在Android MVVM架构中实现简洁高效的依赖管理。通过实战演示,展示了如何定义模块、区分single/factory/viewModel声明,并在各层中注入依赖,从而大幅减少模板代码,提升开发效率和可测试性。

weixin_29010003的博客 291

Koin实战:用Kotlin DSL简化Android依赖注入

本文详细介绍了如何使用Koin这一轻量级依赖注入框架,通过Kotlin DSL简化Android开发中的依赖管理。文章从快速上手、核心概念(single、factory、viewModel)到实战案例(MVVM登录模块)进行了系统讲解,并提供了进阶技巧和避坑指南,帮助开发者高效、优雅地实现依赖注入,提升代码可维护性和可测试性。

weixin_29015801的博客 398

Todometer-KMP架构设计:Koin依赖注入与Clean Architecture实践

Todometer-KMP是一个基于Compose UI Multiplatform构建的跨平台待办事项应用,采用Koin依赖注入和Clean Architecture架构模式,实现了高效的代码组织和跨平台开发。本文将深入解析其架构设计,展示如何在实际项目中应用这些技术,为开发者提供一个清晰的架构参考。 ## 项目架构概览 Todometer-KMP采用了清晰的分层架构,结合了Clean Ar

gitblog_00132的博客 296

Koin在KMM项目中的终极指南:iOS与Android共享依赖注入逻辑

Koin是一个轻量级、实用的Kotlin依赖注入框架,特别适合Kotlin Multiplatform (KMM) 项目。通过Koin,开发者可以在iOS和Android平台之间共享依赖逻辑,大幅提升代码复用率和开发效率。本文将详细介绍如何在KMM项目中配置和使用Koin来实现跨平台依赖注入。 ## 为什么选择Koin for KMM? 🚀 Koin为Kotlin Multiplatform

gitblog_00154的博客 1175

告别内存泄漏:Koin+Room打造安全的数据持久化层

在Android开发中,你是否曾遇到过这样的困境:精心设计的数据库层因为依赖管理混乱导致内存泄漏?或者因为组件耦合度过高,使得单元测试举步维艰?本文将带你探索如何利用Koin依赖注入框架与Room数据库,构建一个既安全又易于维护的数据持久化层,让你的应用告别这些烦恼。 读完本文,你将能够: - 理解Koin与Room整合的核心优势 - 掌握使用Koin注入Room数据库实例的正确方式 - 学会在

gitblog_00080的博客 845

Pokedex单元测试策略:从ViewModel到数据层的全面测试指南

Pokedex是一个基于Kotlin Multiplatform构建的宝可梦图鉴应用,采用MVI架构和现代Android开发技术栈。在跨平台开发中,**单元测试**是保证代码质量的关键环节。本文将详细介绍Pokedex项目的**单元测试策略**,涵盖从ViewModel到数据层的全面测试方法,帮助开发者构建可靠的跨平台应用。 ## 📊 测试架构概览 Pokedex采用分层架构设计,测试策略也

gitblog_00161的博客 307

终极Koin开源生态系统解析:探索15+实用插件与扩展的完整指南

Koin是一个面向Kotlin和Kotlin Multiplatform的轻量级依赖注入框架,以其简洁的API和强大的功能在开发者社区中广受好评。本文将深入解析Koin的开源生态系统,带你探索15+实用插件与扩展,帮助你快速掌握如何利用这些工具提升开发效率。 [![Koin框架logo](https://raw.gitcode.com/gh_mirrors/ko/koin/raw/461b568

gitblog_00939的博客 933

深入解析MovieHunt的MVVM架构:ViewModel与LiveData的最佳实践

想要构建一个高性能、可维护的Android电影应用吗?MovieHunt项目为您展示了如何运用MVVM架构、ViewModel和LiveData打造出色的用户体验!作为一款采用Kotlin、RxJava和Jetpack Compose技术栈的现代Android应用,MovieHunt在架构设计上堪称典范。 ## 🎯 MVVM架构的核心优势 MVVM(Model-View-ViewModel)

gitblog_00867的博客 653
上一篇: compose 桌面开发中如何使用KOIN依赖注入
下一篇: 动不动就要收费,pdf拆分python脚本
lynn8570_blog
博客等级 码龄10年 254粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值