首页 > 解决方案 > 如何在 Spring 测试中模拟 OAuth2Authentication 对象

问题描述

我想在春天测试我的休息控制器。在我的服务中,用户需要传递身份验证令牌。我使用一个令牌实用程序类来解码令牌并获取组织 ID。然后我将 id 用于多个进程。我如何在 Spring 中模拟这个?我已遵循文档,但在运行测试时收到 404。

待办事项控制器

@RequestMapping("todos")
class TodoController {

    @Autowired
    lateinit var todoService: TodoService

    @Autowired
    lateinit var tokenUtils: TokenUtils

    @GetMapping
    fun getAllTodos(authentication: OAuth2Authentication): ResponseEntity<List<Todo>> {
        tokenUtils.init(authentication);
        val organizationId = tokenUtils.organizationId
        return ResponseEntity.ok(todoService.findAll(organizationId))
    }```

I am a bit new to spring tests and will appreciate any help accorded

标签: spring-securityspring-testspring-boot-actuator

解决方案


首先,您需要创建一个实现 Authentication 接口的模拟 Authentication 类。以下大部分代码是自动生成的。覆盖您需要的任何方法(在这种情况下,我只覆盖 getPrincipal 方法)。

import java.util.Collection;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;

public class MockPrincipal implements Authentication {

    public MockPrincipal() {}

    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object getCredentials() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object getDetails() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object getPrincipal() {
        // TODO Auto-generated method stub
        return "mock user";
    }

    @Override
    public boolean isAuthenticated() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
        // TODO Auto-generated method stub

    }



}

之后,您可以像这样模拟 OAuth2Authentication 对象:

MockPrincipal mockUser = new MockPrincipal();
OAuth2Authentication mockOAuth2Object = new OAuth2Authentication(null, mockUser);

推荐阅读