程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了kotlin 单元测试不通过函数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决kotlin 单元测试不通过函数?

开发过程中遇到kotlin 单元测试不通过函数的问题如何解决?下面主要结合日常开发的经验,给出你关于kotlin 单元测试不通过函数的解决方法建议,希望对你解决kotlin 单元测试不通过函数有所启发或帮助;

我有一个 getQueueUrl 函数,用于从 sqs 获取 url,当我将无效值传递到该函数时,该测试假设失败,因为我抛出的实际异常是错误的(InvalIDrequestException),但测试仍然通过并且没有打印我在该函数中放入的消息,为什么会发生这种情况?

class SqsUtil {
    @Throws(QueueDoesnotExistException::class)
    fun getQueueUrl(amazonSQS: AmazonSQS,queuename: String): String {
        try {
            print("defew" + amazonSQs.getQueueUrl((queueName)).queueUrl)
            return amazonSQs.getQueueUrl((queueName)).queueUrl
        } catch (e: QueueDoesnotExistException) {
            logger.error("Unable to connect to SQS: {},Exception: {}",queuename,E)
            throw QueueDoesnotExistException("Unable to connect to SQS: $queuename")
        }
    }

}
 @mock
    private lateinit var sqs: AmazonSQS

@BeforeEach
    fun setup() {
        sqs = AmazonSQSClIEntBuilder.standard()
            .withRegion("us-West-2").build()
    }

private var sqsUtil = mockito.mock(SqsUtil::class.java)

@Test
    fun `Get queue url throws exception`() {

        `when`(sqsUtil.getQueueUrl(sqs,"test")).thenThrow(InvalIDrequestException::class.java)
    }

解决方法

测试我认为你想测试的内容。

首先,从您的代码片段中不清楚您是否已将测试配置为注入 @mock AmazonSQS 变量。

添加对 org.mockito:mockito-junit-jupiter:3.11.0(或任何匹配的 mockito 版本)的依赖。然后使用 @ExtendWith(mockitoExtension::class) 注释您的测试类。 mockitoExtension 扩展 Junit 以根据注释创建 mock 并将其注入测试类。

然后您可以删除您的 @BeforeEach 方法,因为 junit 负责创建模拟 sqs 字段。

接下来,当您调用 private var sqsUtil = mockito.mock(SqsUtil::class.java) 时,您正在模拟我认为您想测试的类。相反,您可以使用 private val sqsUtil = SqsUtil() 实例化您的类。我不完全确定你的代码是如何工作的,当我尝试 mockito 时无法模拟 kotlin 类,因为它是最终的。

然后您使用 when 设置模拟 sqs 以抛出您想要的错误。喜欢

`when`(sqs.getQueueUrl("test")).thenThrow(QueueDoesnotExistException::class.java)

并且您可以检查 SqsUtil 是否重新抛出异常:

assertThrows(QueueDoesnotExistException::class.java) {
    sqsUtil.getQueueUrl(sqs,"test")
}

我的测试类一起看起来像这样

import com.amazonaws.services.sqs.AmazonSQS
import com.amazonaws.services.sqs.model.QueueDoesnotExistException
import org.junit.jupiter.api.Assertions.assertThrows
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.mock
import org.mockito.mockito.`when`
import org.mockito.junit.jupiter.mockitoExtension

@ExtendWith(mockitoExtension::class)
internal class SqsUtilTESTCase {

    @mock
    private lateinit var sqs: AmazonSQS

    private val sqsUtil =  SqsUtil()

    @Test
    fun `Get queue url throws exception`() {
        `when`(sqs.getQueueUrl("test")).thenThrow(QueueDoesnotExistException::class.java)
        assertThrows(QueueDoesnotExistException::class.java) {
            sqsUtil.getQueueUrl(sqs,"test")
        }
    }
}

为了解决 mockito 和 kotlin 不能很好地协同工作的问题,我可以推荐 mockk。对 io.mockk:mockk:1.11.0 的依赖是测试的样子。

import com.amazonaws.services.sqs.AmazonSQS
import com.amazonaws.services.sqs.model.QueueDoesnotExistException
import io.mockk.every
import io.mockk.mockk
import org.junit.jupiter.api.Assertions.assertThrows
import org.junit.jupiter.api.Test

internal class SqsUtilTESTCase {

    private val sqs: AmazonSQS = mockk()

    private val sqsUtil = SqsUtil()

    @Test
    fun `Get queue url throws exception`() {
        every { sqs.getQueueUrl("test") }.throws(QueueDoesnotExistException("fail"))
        assertThrows(QueueDoesnotExistException::class.java) {
            sqsUtil.getQueueUrl(sqs,"test")
        }
    }
}

大佬总结

以上是大佬教程为你收集整理的kotlin 单元测试不通过函数全部内容,希望文章能够帮你解决kotlin 单元测试不通过函数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。