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"
当我使用 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
是模拟,它只会 returnnull
,因此比较会产生false
但不会做任何有意义的事情。 - 如果
authentication
是一个spy,它会return原始方法的结果,比较结果将取决于它。
我认为您可能已尝试对方法的结果进行存根。为此,您想像
那样使用>>
given:
authentication.getCredentials() >> "Token"