gpt4 book ai didi

kotlin - 如何使用 Dagger2 和 Kotlin 对 AWS Lambda 处理程序进行单元测试?

转载 作者:行者123 更新时间:2023-12-02 13:22:32 24 4
gpt4 key购买 nike

我在试图弄清楚如何为 AWS Lambda 处理程序编写单元测试时遇到了一些麻烦。这是一个例子:

应用.kt 是 AWS lambda 处理程序类。

class App : RequestHandler<Any, Any> {
private val component: AppComponent by lazy {
DaggerAppComponent.create()
}
override fun handleRequest(input: Any, context: Context): Any {
component.getBusinessLogic().doSomething()
// code
}
}

应用组件.kt 是获取业务逻辑的 Dagger2 组件。
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
fun getBusinessLogic(): BusinessLogic
}

应用模块.kt 是 Dagger2 模块。
@Module
abstract class AppModule {
@Provides
@Singleton
fun provideAmazonECS(): AmazonECS = AmazonECSClient.builder().build()
}

业务逻辑.kt 是 AWS lambda 函数的业务逻辑
class BusinessLogic @Inject constructor(...) {
fun doSomething(): Any{
// code to use AmazonECS
}
}

现在,这是我想测试的 App.kt 通过模拟 BusinessLogic 类。

AppTest.kt
class AppTest {
@Test
fun `test something`() {
val mockLogic = mock(BusinessLogic::class.java)
val app = App()
`when`(mockLogic.doSomething()).thenReturn(...)

app.handleRequest(...)
}
@Test
fun `test exception`() {
val mockLogic = mock(BusinessLogic::class.java)
val app = App()
`when`(mockLogic.doSomething()).thenThrow(...)

assertThrows<...> { app.handleRequest(...) }
}
}

所以,我的麻烦是我不确定如何使用模拟的 BusinessLogic实例。 App 类必须有一个空的构造函数供 AWS lambda 实例化。修改代码比如创建一个辅助构造函数只是为了单元测试感觉不对。

在此先感谢,感谢您对此问题的任何帮助。

最佳答案

感谢@Dominik G. 的评论,这是基于对话的解决方案。

应用.kt 被修改为只有一行,因此不需要进行单元测试。

class App : RequestHandler<Any, Any> {
private val component: AppComponent by lazy {
DaggerAppComponent.create()
}
override fun handleRequest(input: Any, context: Context): Any {
return component.getLambdaLogic().handleRequest(input, context)
}
}

LambdaLogic.kt 现在拥有专门针对 AWS lambda 的逻辑。
class LambdaLogic @Inject constructor(businessLogic: BusinessLogic) {
fun handleRequest(input: Any, context: Context): Any {
businessLogic.doSomething()
// code
}
}

应用组件.kt 修改为返回 LambdaLogic而不是 BusinessLogic .
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
fun getLambdaLogic(): LambdaLogic
}

LambdaLogicTest.kt 测试 AWS lambda 逻辑。
class LambdaLogicTest{
@Test
fun `test something`() {
val mockBusinessLogic = mock(BusinessLogic::class.java)
val lambdaLogic = LambdaLogicTest(mockBusinessLogic)
`when`(mockBusinessLogic.doSomething()).thenReturn(...)

lambdaLogic.handleRequest(...)
}
@Test
fun `test exception`() {
val mockBusinessLogic = mock(BusinessLogic::class.java)
val lambdaLogic = LambdaLogicTest(mockBusinessLogic)
`when`(mockBusinessLogic .doSomething()).thenThrow(...)

assertThrows<...> { lambdaLogic.handleRequest(...) }
}
}

使用这种方法,不再需要进行单元测试 App.kt我们还可以对 AWS lambda 逻辑进行单元测试。

关于kotlin - 如何使用 Dagger2 和 Kotlin 对 AWS Lambda 处理程序进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52204679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com