首页 > 解决方案 > 如何测试以 Authentication 对象为参数的 Spring Boot Service 方法?

问题描述

我正在 Kotlin 中构建一个 Spring Boot 端点,我需要为此创建测试。我可以在下面为我的控制器类创建一个测试:

import org.springframework.security.core.Authentication

@RestController
@RequestMapping("/servicos/solicitacoes")
class SolicitacaoController {


    @Autowired
    private lateinit var solicitacaoService: SolicitacaoService

    @PostMapping(consumes = [MediaType.APPLICATION_JSON_VALUE])
    fun post(@RequestBody solicitacaoDTO: SolicitacaoDataClassDTO, @ApiIgnore authentication: Authentication): Solicitacao {
        return solicitacaoService.addSolicitacao(solicitacaoDTO, authentication)
    }
}

但是,由于我的服务类有一个 Authentication 参数,我不知道如何为我的服务类创建测试。

这是我的服务类:

@Service
class SolicitacaoService {
    @Autowired
    private lateinit var solicitacaoRepository: SolicitacaoRepository

    @Autowired
    private lateinit var acessoSistema: AcessoSistema

    fun addSolicitacao(solicitacaoDTO: SolicitacaoDataClassDTO, authentication: Authentication): Solicitacao{
        val idInstitucional = acessoSistema.getIdInstitucional(authentication)
        // Some Businnes logic
        return solicitacaoRepository.save(solicitacao)
    }
}

身份验证过程由 keycloak 令牌完成,前端需要获取该令牌才能访问后端服务。

我可以测试我的控制器,因为在我的发布请求中,我在请求的标头中发送了令牌。但是,为了在我的服务中测试 addSolicitacao 方法,我需要创建一个 Authentication 对象。

关于如何为我的 SolicitacaoService 创建测试的任何想法?我正在使用 JUnit 和 Mockito。我想在我的 SolicitacaoServiceTest 中模拟我的 SolicitacaoRepository。但是,我不知道如何使用 Keycloak 服务器的参数创建对象身份验证。

这是我的 SolicitacaoServiceTest:

@RunWith(SpringRunner::class)
//@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class SolicitacaoServiceTest {

    @Autowired
    private lateinit var solicitacaoService: SolicitacaoService

    @MockBean
    private lateinit var solicitacaoRepository: SolicitacaoRepository

    @Test
    fun quandoAdicionarSolicitacaoComUsuarioComum_entaoSolicitacaoDeveSerRetornada(){


    }


}

标签: spring-bootkotlinjunitmockitokeycloak

解决方案


推荐阅读