Unit testing 为amazonSNS.publish()编写测试用例时出错
Src代码Unit testing 为amazonSNS.publish()编写测试用例时出错,unit-testing,kotlin,amazon-sns,mockk,Unit Testing,Kotlin,Amazon Sns,Mockk,Src代码 class ReportingUtil { companion object { private val gson = Gson() private val amazonSNS = AmazonSNSClientBuilder.standard().build() private val topicArn = AppConfig.findString(TOPIC_ARN) } /** * This f
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)
}
@测试
fun`将发票数据发布到SNS主题的测试`(){
initConfig()
val amazonSNS=mockk()
val invoiceData=invoiceData(“a”、“a”、“a”、BigDecimal(6)、“a”、“a”、可变映射函数(“a”到“a”))
val reportingUtil=reportingUtil()
每{
amazonSNS.publish(“topicArn”、“jsonInvoiceMap”)
}返回PublishResult().withMessageId(“MESSAGE_ID”)
报告直至发布失败发票(发票数据)
}
这在src发布行上给了我以下错误,
com.amazonaws.services.sns.model.InvalidParameterException:无效
参数:TopicArn或Targetran原因:无所需的值
参数(服务:AmazonSN;状态代码:400;错误代码:
无效参数;请求ID:5f1732ac-d63e-5e13-964c-65c312e218d7;
代理:空)
我的用例不允许我使用依赖注入,因此我在这里使客户机是静态的
我还想在catalyst中添加自定义优化计划,这也将在构建时触发。在执行之前有没有办法完成所有这些工作?您模拟的
AmazonS
不是用于在publishFailureInvoiceToSNS
中发布数据的。因此,当您调用publishFailureInvoiceToSNS时,实际上是在调用真正的SNSAPI
您必须重构代码以使用某种依赖项注入。至少你应该让它可配置。没有“不允许使用DI”的用例
若您使用的是JUnit5,那个么您可以在测试中为AWS客户端注入。我还建议将其用于单元测试。好的,但由于某些原因……我不允许在这里使用DI。在这种情况下我怎么能模仿它呢?说出原因吧?这基本上是一个实用程序包…这个包将被我的许多客户集成。这些客户机使用spring、guice、dagger框架等,所以如果我使用这些框架中的任何一个,都会出现问题,所以提供客户机只是他们的责任。看,您正在使用
amazonsclientbuilder.standard().build()
。但是如果你的客户需要改变地区呢?他们应该能够配置客户端。