【问题标题】:Getting error while writing test cases for amazonSNS.publish()为 amazonSNS.publish() 编写测试用例时出错
【发布时间】:2020-06-26 09:49:37
【问题描述】:

源代码

class ReportingUtil {
    companion object {
        private val gson = Gson()
        private val amazonSNS = AmazonSNSClientBuilder.standard().build()
        private val topicArn = AppConfig.findString(TOPIC_ARN)
    }

    /**
     * This function will convert object to json format and will publish to SNS topic.
     * [invoiceData] -
     */
    fun publishFailureInvoiceToSNS(invoiceData: InvoiceData) {
        val jsonInvoiceMap = gson.toJson(invoiceData)
        log.info("The Invoice : $invoiceData is converted to json format : $jsonInvoiceMap")
        amazonSNS.publish(topicArn, jsonInvoiceMap)
        log.info("Json invoice: $jsonInvoiceMap is published to the sns topic")
    }
}

单元测试

@Test
fun `test to publish invoice data to SNS topic`(){
    initConfig()
    val amazonSNS = mockk<AmazonSNS>()
    val invoiceData = InvoiceData("a", "a", "a", BigDecimal(6), "a", "a", mutableMapOf("a" to "a"))
    val reportingUtil = ReportingUtil()
    every { 
            amazonSNS.publish("topicArn", "jsonInvoiceMap") 
   } returns PublishResult().withMessageId("MESSAGE_ID")
    reportingUtil.publishFailureInvoiceToSNS(invoiceData)
}

这让我在 src 发布行出现以下错误,

com.amazonaws.services.sns.model.InvalidParameterException:无效 参数:TopicArn 或 TargetArn 原因:required 没有值 参数(服务:AmazonSNS;状态代码:400;错误代码: 无效的参数;请求 ID:5f1732ac-d63e-5e13-964c-65c312e218d7; 代理:空)

我的用例不允许我使用依赖注入,因此我在这里将客户端设为静态。

我还想在催化剂中添加我的自定义优化计划,这也将在构建时触发。在执行之前有什么办法可以做到这一切吗?

【问题讨论】:

    标签: unit-testing kotlin amazon-sns mockk


    【解决方案1】:

    你嘲笑的amazonSNS不是publishFailureInvoiceToSNS中用来发布数据的那个不是那个。因此,当您调用 publishFailureInvoiceToSNS 时,您实际上是在调用真正的 SNS API。

    您必须重构代码以使用某种依赖注入。至少你应该让它可配置。没有“不允许使用 DI”的用例。

    如果您使用的是 JUnit 5,则可以在测试中使用 these helpers 进行 AWS 客户端注入。我还建议使用localstack 进行单元测试。

    【讨论】:

    • 好的,但由于某种原因……我不允许在这里使用 DI。在那种情况下我该如何模拟它?
    • 说出原因?
    • 这基本上是一个实用程序包...这个包将被我的许多客户集成。这些客户端使用 spring、guice、dagger 框架等,所以如果我使用这些框架中的任何一个都会有问题
    • 因此,提供客户只是他们的责任。看,你正在使用AmazonSNSClientBuilder.standard().build()。但是,如果您的客户需要更改区域怎么办?他们应该能够配置客户端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多