【问题标题】: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);