大佬教程收集整理的这篇文章主要介绍了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,请注明来意。