Spock:Class Cast Exception 但适用于真实调用

Spock:Class Cast Exception but works with real call

当我使用 spring 测试时,我正在测试以下代码 boot start 工作正常,但是当我尝试使用 spock.And throws

进行测试时失败
java.lang.ClassCastException: class com.sun.proxy.$Proxy30 cannot be cast to class java.lang.String (com.sun.proxy.$Proxy30 is in unnamed module of loader 'app'; java.lang.String is in module java.base of loader 'bootstrap')

如何使用代码解决此问题 issue.Updated post 并在测试失败的地方进行测试

测试:

class JWTAuthenticationManagerSpec extends Specification {

    private JWTAuthenticationManager sut
    private Authentication authentication = Stub()
   
    def 'authenticate throws exception'() {

        given:
        authentication.getCredentials() == "Token"

        when:
        sut.authenticate(authentication)
        then:
        ForbiddenException ex = thrown()
    }
}

Class 方法测试

 override fun authenticate(authentication: Authentication): Mono<Authentication> {
        //Unit Test Class Cast Exception is being thrown Here
        val token = authentication.credentials as String
        if (token.isNullOrEmpty()) {
            throw ForbiddenException("Invalid access token supplied.")
        } else {
            log.info { "JWT Token Validation Success"  }
        }
        return Mono.empty()
    }

我们是否必须添加额外的编码才能删除此处抛出的 class 转换异常

这部分

given:
authentication.getCredentials() == "Token"

看起来不对。据我所知,比较 given: 块中的两个值对您没有帮助:

  • 如果 authentication 是模拟,它只会 return null,因此比较会产生 false 但不会做任何有意义的事情。
  • 如果authentication是一个spy,它会return原始方法的结果,比较结果将取决于它。

我认为您可能已尝试对方法的结果进行存根。为此,您想像

那样使用 >>
given:
authentication.getCredentials() >> "Token"