spring-boot - 如何测试以 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(){
}
}
解决方案
推荐阅读
- python - 在 lambda 函数中使用条件
- flutter - Flutter - 在应用程序启动时从 Firestore 获取数据并保存到 Provider
- amazon-web-services - Cloudformation 堆栈默认参数 SSM 参数存储
- c++ - 如何在没有静态的成员函数内调用成员函数?
- javascript - 使用 gcloud cli 时自动检测要部署的可用云功能
- debugging - MOVF 操作后工作寄存器中的值错误
- python - 在 Kafka 中生成消息之前是否需要序列化字符串值?
- php - MySQL 表设计可保存多个训练日期
- python-3.x - Python:lower() 方法在字符串中生成错误的字母
- azerothcore - Visual Studio:属性“nodiscard”需要编译器标志“/std:c++17”