Mockk - ClassCastException при имитации окончательного класса, который реализует несколько интерфейсов
Я пытаюсь использовать макет этого класса 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)
}
}
Любые идеи, как это исправить?
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()