我正在尝试使用该Java类的模拟:
public final class HttpSecurity extends
AbstractConfiguredSecurityBuilder<DefaultSecurityFilterChain, HttpSecurity>
implements SecurityBuilder<DefaultSecurityFilterChain>,
HttpSecurityBuilder<HttpSecurity>
所以我创建了一个像这样的模拟:
private val httpSecurity: HttpSecurity = mockk(relaxed = true)
为了测试这段Java代码:
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().
headers().frameOptions().disable().and()
.formLogin().loginPage("/login").permitAll()....etc
当我尝试使用它时出现以下错误
java.lang.ClassCastException: org.springframework.security.config.annotation.web.HttpSecurityBuilder$Subclass2 cannot be cast to org.springframework.security.config.annotation.web.builders.HttpSecurity
在这里测试课程
package com.whatever
import io.mockk.mockk
import io.mockk.mockkClass
import org.junit.jupiter.api.Test
import org.springframework.core.env.Environment
import org.springframework.security.authentication.AuthenticationManager
import org.springframework.security.config.annotation.web.builders.HttpSecurity
internal class SecurityConfigTest {
private val authManager: AuthenticationManager = mockk()
val env : Environment = mockk()
private val httpSecurity: HttpSecurity = mockk(relaxed = true)
val securityConfig : SecurityConfig = SecurityConfig(authManager,env)
@Test
fun configure() {
securityConfig.configure(httpSecurity)
}
}
有什么办法解决这个问题吗?
答案 0 :(得分:1)
这里的问题是模板参数类型被删除并且无法恢复。唯一的解决方案是直接指定模拟,以便reified
类型将捕获实际的类:
val mockk = mockk<HttpSecurity>(relaxed = true)
val csrf = mockk.csrf()
every { csrf.disable() } returns mockk(relaxed = true)
val disable = csrf.disable()
disable.headers()