【问题标题】:How do I mock an OAuth2Authentication Object in Spring Test如何在 Spring 测试中模拟 OAuth2Authentication 对象
【发布时间】:2019-12-02 16:52:06
【问题描述】:

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

TodoController

@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-security spring-test spring-boot-actuator


    【解决方案1】:

    首先,您需要创建一个实现 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);
    

    【讨论】:

    • 覆盖是否被视为最佳做法?
    猜你喜欢
    • 2016-09-29
    • 2019-01-30
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 2023-03-22
    相关资源
    最近更新 更多