使用 Kotlin 在 Spock 中模拟 @ConfigurationProperties 不起作用

Mocking @ConfigurationProperties in Spock with Kotlin not work

我正在尝试使用 Spock 和 ConfigurationProperties。
但是在我的单元测试中,Mocking @ConfigurationProperties 对我不起作用。

属性Class

@ConfigurationProperties(prefix = "jwt")
@ConstructorBinding
class JwtProperties(
    val secretKey: String,
    val accessTokenExp: Long,
    val refreshTokenExp: Long
) {

    companion object {
        const val TOKEN_PREFIX = "Bearer "
        const val TOKEN_HEADER_NAME = "Authorization"
        const val ACCESS_VALUE = "access"
        const val REFRESH_VALUE = "refresh"
    }
}

测试Class

class JwtTokenProviderTest extends Specification {

    private JwtProperties jwtProperties = GroovyMock(JwtProperties)
    private AuthDetailsService authDetailsService = GroovyMock(AuthDetailsService)
    private JwtTokenProvider jwtTokenProvider = new JwtTokenProvider(authDetailsService, jwtProperties)

    def "AuthenticateUser Success"() {
        given:
        jwtProperties.getSecretKey() >> "asdfdsaf"
        jwtProperties.getAccessTokenExp() >> 100000
        def bearerToken = jwtTokenProvider.getAccessToken("email").accessToken
        def accessToken = jwtTokenProvider.parseToken(bearerToken)
        authDetailsService.loadUserByUsername("email") >> new AuthDetails(new User())

        when:
        jwtTokenProvider.authenticateUser(accessToken)

        then:
        noExceptionThrown()
        .
        .
        .

但是当我 运行 使用调试模式进行测试时,JwtProperties 的字段从未初始化。

您的应用程序中的 JwtProperties 由 spring 实例化。 Spring 将读取属性文件中的值,然后创建具有所需值的实例。

在您的测试中,您没有任何 spring 上下文,因此不会为您创建任何 JwtProperties。此外,你在嘲笑它。我认为嘲笑这个没有意义,因为您只需要创建具有您想要的值的实例。

就这样:

class JwtTokenProviderTest extends Specification {

    private JwtProperties jwtProperties = JwtProperties("my-secret", 60, 120)
    private AuthDetailsService authDetailsService = GroovyMock(AuthDetailsService)
    private JwtTokenProvider jwtTokenProvider = new JwtTokenProvider(authDetailsService, jwtProperties)