0

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

属性类

@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 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 的字段从未初始化。

4

1 回答 1

1

应用程序中的 JwtProperties 由 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)

于 2022-01-22T08:22:58.677 回答