NetMock 简介:简化 Java、Android 和 Kotlin 多平台中的 HTTP 请求测试

这篇具有很好参考价值的文章主要介绍了NetMock 简介:简化 Java、Android 和 Kotlin 多平台中的 HTTP 请求测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

NetMock 简介:简化 Java、Android 和 Kotlin 多平台中的 HTTP 请求测试

NetMock 简介:简化 Java、Android 和 Kotlin 多平台中的 HTTP 请求测试

NetMock可让我们摆脱在测试环境中模拟请求和响应的复杂性。
NetMock 简介:简化 Java、Android 和 Kotlin 多平台中的 HTTP 请求测试
NetMock是一个功能强大、用户友好的库,旨在简化模拟HTTP请求和响应的过程。

对开发者来说,测试HTTP请求经常会带来一些挑战,因为要在测试环境中模拟请求和响应的复杂性很高。这样就会增加手动测试的时间和精力投入。我自己曾经也遇到过使用其他HTTP库和繁琐的模拟工具时的困扰,于是决定引入一个极好的解决方案:NetMock

NetMock与Java、Android和Kotlin Multiplatform集成非常方便。只需要进行简单的设置,就可以轻松创建模拟,准确模仿客户端请求和真实终端点的响应。NetMock的一个关键优势是对模拟HTTP请求和响应采用了统一的方法。这在使用不同库的项目上或者考虑从一种库转换到另一种库时特别有用。

NetMock还有一个值得注意的特点,就是用户友好的设计。与其他许多HTTP模拟工具不同,NetMock更注重易用性。这个库提供了直观的界面和简单的设置过程,方便开发者更好地掌握HTTP库的知识。

不管您是资深开发者还是刚刚起步,NetMock都是简化工作流程、减少创建可靠软件所需的时间和精力的完美解决方案。

如果您想进一步了解NetMock,可以在GitHub上找到NetMock的代码库,网址是https://github.com/DenisBronx/NetMock

提升HTTP相关代码的测试策略

作为一名专业软件工程师,我坚信对于所有代码的全面单元测试非常重要。然而,我发现许多开发人员在网络层的单元测试方面存在一个常见问题,就是因为模拟和测试这个领域比较困难,所以他们往往忽视了该部分的单元测试。相反,他们更倾向于依赖端到端自动化测试或手动测试。

在多个项目中,我发现一种解决方法是将与HTTP相关的代码分离出来,以便能够独立测试系统的其他部分。虽然这种方法可以使代码库和测试类更加简洁,但也往往导致忽视对HTTP代码本身的测试,因为大家觉得这部分很难测试。然而,这样会导致与HTTP请求和JSON解析有关的关键逻辑没有得到充分验证。

这个问题在使用Retrofit库的项目中特别突出,该库通过接口抽象了与HTTP相关的逻辑。以下是一个代码片段的例子:

interface GitHubService {
    @GET("users/{user}/repos")
    suspend fun listRepos(@Path("user") user: String): List<RepoDto>
}

class GitHubRepositoryImpl(
    private val githubService: GitHubService,
    private val repoMapper: RepoMapper
): GitHubRepository {
    override suspend fun listRepos(user: String): List<Repo> {
        val repoDtos = githubService.listRepos(user)
        return repoMapper.map(repoDtos)
    }
}

虽然这种方法可以简化存储库和测试类,但它通常会忽略与HTTP相关的重要测试。此外,开发人员可能会为了简化存储库的单元测试而创造一些不必要的组件。

单元测试的目的是为了防止和发现开发人员犯的错误,并确保代码按照预期的功能运行。如果没有充分的测试,即使是一些简单的错误,比如将路径从users/{user}/repos改为user/{user}/repos,或者在RepoDto中修改一个字段的名称,都可能会被忽视掉。这在专业的项目中是不能接受的。

我并没有针对Retrofit库本身提出批评。

相反,我认为它是一款非常出色且易于理解的库。

此外,我也认识到将与HTTP相关的代码分离到独立的组件中对于组织和可维护性是很有价值的。

然而,我想着重指出我在很多项目中观察到的一个有缺陷的测试策略。这个策略往往没有充分关注对HTTP代码进行全面的测试,导致一些潜在问题被忽视掉。通过强调这个问题,我希望鼓励开发人员优先考虑对与HTTP相关的逻辑进行全面的测试,从而确保项目的整体质量和可靠性。
NetMock 简介:简化 Java、Android 和 Kotlin 多平台中的 HTTP 请求测试

使用NetMock来Mocking请求与响应

@Test
fun `your test`() = runTest {
    val user = "some_user"
    netMock.addMock(
        request = {
            method = Method.Get
            requestUrl = "https://api.github.com/users/$user/repos"
        },
        response = {
            code = 200
            body = readFromResources("responses/repo_list.json")
        }
    )

    val result = sut.listRepos(user)

    //...
}

为了模拟请求和响应,您可以使用NetMock提供的简单API。

通过将模拟项添加到预期请求和响应的队列中,在测试期间可以拦截和控制HTTP交互的行为。

创建一个NetMock实例

NetMock提供了两种版本:netmock-servernetmock-engine

netmock-server版本适用于Java、Kotlin和Android,它不依赖于任何库。通过将网络请求重定向到本地Web服务器(MockWebServer),可以模拟网络请求。该版本非常适合在非多平台项目上工作的开发人员,他们希望在不需要设置独立服务器的情况下测试网络请求。

另一方面,netmock-engine版本专门为使用Ktor或Kotlin Multiplatform的开发人员设计。它使用MockEngine代替本地服务器,在使用Ktor的开发人员中具有轻量级和多平台的优势。

使用NetMockServer

要将netmock-server添加到项目中,请将以下内容添加到build.gradle文件的依赖项中:

dependencies {
    testImplementation "io.github.denisbronx.netmock:netmock-server:0.4.0"
}

接下来,按照以下方式创建一个NetMockServer实例:

@get:Rule
val netMock = NetMockServerRule()

NetMockServer启动了一个本地服务器,使用MockWebServer来拦截您的请求。NetMockServerRule处理了服务器的生命周期,在每个测试中自动启动和关闭它。

一旦服务器开始运行,您可以使用netmock.baseUrl配置您的代码,将其指向localhost的基本URL。以下是Retrofit和Ktor的示例:

使用localhostRetrofit示例:

@get:Rule
val netMock = NetMockServerRule()

private val service = Retrofit.Builder()
    .baseUrl(netMock.baseUrl)
    .build()
    .create(GitHubService::class.java)

使用localhostKtor示例:

@get:Rule
val netMock = NetMockServerRule()
    
private val client = HttpClient(OkHttp) {
    defaultRequest {
        url(netMock.baseUrl)
    }
}

或者,您可以通过使用netmock.interceptor来添加一个拦截器,该拦截器会自动将请求重定向到本地主机:

下面是一个使用真实URL的Retrofit示例:

@get:Rule
val netMock = NetMockServerRule()

private val service = Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .client(OkHttpClient.Builder().addInterceptor(netMock.interceptor).build())
    .build()
    .create(GitHubService::class.java)

下面是一个使用真实URL的Ktor示例:

@get:Rule
val netMock = NetMockServerRule()
    
private val client = HttpClient(OkHttp) {
    engine {
        addInterceptor(netMock.interceptor)
    }
}

建议使用拦截器,因为它可以让您处理真实和动态的URL。

不过要注意,您需要使用与OkHttp拦截器兼容的库,比如OkHttp本身、Retrofit或Ktor。

结论

除了初始化过程外,NetMock的两个版本基本相同。这意味着在netmock-servernetmock-engine之间切换时,只需要做一些小的修改。这种灵活性使您能够无需改动测试代码,顺利地在不同的库之间切换,比如从Retrofit切换到Ktor,或者反过来。

将测试框架与底层库解耦会增强您重构代码时的自信心。进行修改时,您只需修改生产代码,而测试代码保持不变。这种方法大大降低了在重构过程中产生意外副作用的风险,并确保您的测试准确反映了代码的行为。

总的来说,NetMock的灵活性使您能够轻松适应不同的库,并且方便地进行代码重构,从而增强代码的可靠性和可维护性。

最后,我要衷心感谢那些抽出时间阅读本文的读者们。我希望所提供的见解能够增进大家对于在网络层进行全面测试的重要性的理解。

再次感谢大家的关注,请在使用NetMock进行愉快测试时保持关注!

GitHub

https://github.com/square/okhttp/tree/master/mockwebserver
https://github.com/DenisBronx/NetMock
NetMock 简介:简化 Java、Android 和 Kotlin 多平台中的 HTTP 请求测试文章来源地址https://www.toymoban.com/news/detail-500069.html

到了这里,关于NetMock 简介:简化 Java、Android 和 Kotlin 多平台中的 HTTP 请求测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java高级语法】(十六)方法引用:掌握Java中的方法引用,简化代码的实用指南~

    方法引用是Java编程语言中的一个重要特性,它首次出现在Java 8版本中。这一特性旨在简化函数式编程中使用Lambda表达式的代码,使代码更加清晰、简洁。 方法引用是通过名称引用一个现有的方法来代替Lambda表达式的一种方式 。它允许将方法本身作为一个对象传递或存储,并

    2024年02月16日
    浏览(30)
  • Android初学之android studio运行java/kotlin程序

    第一步骤: File — New — New Module ,然后弹出一个框,(左边)选择 Java or Kotlin Library ,(右边)编辑自己的图书馆名、包名、类名,选择 Java 一个语言,然后 Finish 如下图: 然后,就可以看见我新建的 java Library 了,如下图: 第二步骤:马上写个测试程序 看看能不能运行

    2024年02月11日
    浏览(40)
  • 简化代码结构与提高灵活性:学习Java设计模式中的装饰器模式

    简化代码结构与提高灵活性:学习Java设计模式中的装饰器模式 在软件开发中,我们经常会遇到需要在不修改现有代码的情况下,对已有对象进行功能扩展或修改的需求。此时,装饰器模式就是一种非常有用的设计模式,它通过动态地将责任附加到对象上,来扩展对象的功能

    2024年02月16日
    浏览(34)
  • Android实战基础 - Java、Kotlin 代码互转

    在Android现阶段,Kotlin已经成为普遍性使用的语言,而在其使用阶段中Java和Kotlin的混用很常见,为了便于开发,我们需要掌握Java、Kotlin文件的转换 这应该是我以前刚学Kotlin时就想记录的一篇blog,没想到隔了这么久才进行记录(嗯… 主要这俩年好像有点忙…) 个人建议:正常

    2024年02月11日
    浏览(46)
  • Kotlin & Compose Multiplatform 跨平台(Android端、桌面端)开发实践之使用 SQLDelight 将数据储存至数据库

    取标题的时候我还在想,我应该写 Compose 跨平台呢还是写 Kotlin 跨平台。 毕竟对于我的整体项目而言,确实是 Compose 跨平台开发,但是对于我这篇文章要说的东西,那其实也涉及不到多少 Compose 相关的内容,更多的应该是 Kotlin Multiplatform 相关的内容。 二者取舍不下,干脆都

    2024年02月15日
    浏览(36)
  • Android java项目添加kotlin混合开发环境配置

    Android Studio java代码中添加kotlin混合开发 1.项目的build.gradle中添加kotlin-gradle-plugin buildscript {     repositories {         google()         jcenter()              }     dependencies {         classpath \\\'com.android.tools.build:gradle:7.3.1\\\'         classpath \\\"org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20\\\"

    2023年04月19日
    浏览(36)
  • Spring-1-深入理解Spring XML中的依赖注入(DI):简化Java应用程序开发

    前两篇文章我们介绍了什么是Spring,以及Spring的一些核心概念,并且快速快发一个Spring项目,以及详细讲解IOC,今天详细介绍一些DI(依赖注入) 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配 思考:向一个类中传递数据的方式有几种?(给类

    2024年02月13日
    浏览(40)
  • 在 Android Studio Java 项目里混合 Kotlin 编程

    首先,先搞明白一个概念,这里的 Java 混合 Kotlin 是指文件层级的混合,即 Java 代码还是写在 .java 文件中,Kotlin 代码还是写在 .kt 文件中,只不过是可以在 Java 的代码中可以调用自己写好的 Kotlin 类,从 Java 的角度看,它并不知道它调用的这个类是 Kotlin 写的,这个类和平时遇

    2024年02月08日
    浏览(39)
  • Android的Gradle、Studio、Java、Kotlin版本兼容

    Android Gradle 插件和 Android Studio 兼容性 Android Studio 版本 所需插件版本 Hedgehog - 2023.1.1 3.2-8.2 Giraffe - 2022.3.1 3.2-8.1 Flamingo - 2022.2.1 3.2-8.0 Electric Eel - 2022.1.1 3.2-7.4 Dolphin - 2021.3.1 3.2-7.3 Chipmunk - 2021.2.1 3.2-7.2 Bumblebee - 2021.1.1 3.2-7.1 Arctic Fox - 2020.3.1 3.1-7.0 Gradle版本和Java版本对应关系 Ja

    2024年02月09日
    浏览(34)
  • Android 安卓开发语言kotlin与Java该如何选择

            如今在Android开发中,应用层开发语言主要是Java和Kotlin,Kotlin是后来加入的,主导的语言还是Java。kotlin的加入仿佛让会kotlin语言的开发者更屌一些,其实不然。         有人说kotlin的引入是解决开发者复杂的逻辑,并且对空指针控制的比较友好,但是我们在开

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包