【问题标题】:How to use mocks with MicronautLambdaHandler in a JUnit class annotated @MicronautTest?如何在带有 @MicronautTest 注释的 JUnit 类中使用带有 MicronautLambdaHandler 的模拟?
【发布时间】:2020-11-25 18:33:48
【问题描述】:

我想用我的MicronautLambdaHandler 应用程序模拟here 中记录的协作者,但如果您只是通过调用其构造函数来实例化MicronautLambdaHandler,它显然不会从您的测试上下文中获取任何内容。

具体来说,这并没有按预期工作:

import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder
import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext
import com.amazonaws.services.lambda.runtime.Context
import com.fasterxml.jackson.databind.ObjectMapper
import io.micronaut.context.ApplicationContext
import io.micronaut.context.ApplicationContextBuilder
import io.micronaut.context.annotation.Factory
import io.micronaut.context.env.Environment
import io.micronaut.http.HttpHeaders
import io.micronaut.http.HttpMethod
import io.micronaut.http.HttpStatus
import io.micronaut.http.MediaType
import org.junit.jupiter.api.Test
import io.micronaut.function.aws.proxy.MicronautLambdaHandler
import io.micronaut.security.authentication.AuthenticationException
import io.micronaut.security.authentication.AuthenticationFailed
import io.micronaut.security.authentication.AuthenticationProvider
import io.micronaut.security.authentication.AuthenticationResponse
import io.micronaut.test.annotation.MockBean
import io.micronaut.test.extensions.junit5.annotation.MicronautTest
import io.mockk.every
import io.mockk.mockk
import io.reactivex.Maybe
import org.assertj.core.api.Assertions
import org.assertj.core.api.Assertions.assertThat
import org.reactivestreams.Publisher
import java.lang.RuntimeException
import javax.inject.Inject

@MicronautTest
class ManualInstantiationTest {
    @Inject
    lateinit var objectMapper: ObjectMapper

    @Inject
    lateinit var authenticationProvider: AuthenticationProvider

    @MockBean(AuthenticationProvider::class)
    fun authenticationProviderMock() = mockk<AuthenticationProvider>()

    @Test
    fun testLoginHandler() {
        every { authenticationProvider.authenticate(any(), any()) } answers {
            Maybe.error<AuthenticationResponse>(
                AuthenticationException(
                    AuthenticationFailed("Incorrect password")
                )
            ).toFlowable()
        }

        val handler = MicronautLambdaHandler()
        val loginRequest = Registration("username", "password")
        val json = objectMapper.writeValueAsString(loginRequest)
        val request = AwsProxyRequestBuilder("/login", HttpMethod.POST.toString())
            .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
            .body(json)
            .build()
        val lambdaContext: Context = MockLambdaContext()
        // this.authenticationProvider is never used
        val response = handler.handleRequest(request, lambdaContext)
    }
}

我也尝试过@InjectMicronautLambdaHandler 类型的字段,但由于没有注册该类型的 bean,所以失败了。

【问题讨论】:

  • "Specifically, this doesn't work as expected..." - 你期待什么,发生了什么?
  • 我希望使用模拟,但没有使用。

标签: micronaut micronaut-aws


【解决方案1】:

Micronaut 暂时不支持使用 @MicronautTest 测试 lambda。 MicronautLambdaHandlerMicronautRequestHandler 创建它们自己的上下文,完全独立于使用 @MicronautTest 配置的实际注册您的模拟的上下文。它们也不是豆子,所以注入它们什么都不做。

这是一个已知问题(例如,请参阅 here)并且正在处理中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2020-06-05
    • 2018-06-25
    • 2018-12-30
    相关资源
    最近更新 更多