Mockk - ClassCastException при имитации окончательного класса, который реализует несколько интерфейсов - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь использовать макет этого класса 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 Ответ

0 голосов
/ 26 января 2019

Проблема здесь в том, что тип аргумента шаблона удален и его невозможно восстановить. Единственное решение - указать макет напрямую, чтобы тип reified захватывал фактический класс:

    val mockk = mockk<HttpSecurity>(relaxed = true)
    val csrf = mockk.csrf()
    every { csrf.disable() } returns mockk(relaxed = true)
    val disable = csrf.disable()
    disable.headers()
...