Spring Boot测试中发生HTTP 401未经授权的错误

EnDelt64:

实体类

@Getter
@NoArgsConstructor
@Entity
public class Posts {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(length = 500, nullable = false)
    private String title;
    
    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;
    
    private String author;
    
    @Builder
    public Posts(String title, String content, String author) {
        this.title = title;
        this.content = content;
        this.author = author;
    }
}

测试码

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class PostsAPIControllerTest {
    @LocalServerPort
    private int port;
    
    @Autowired
    private TestRestTemplate restTemplate;
    
    @Autowired
    private PostsRepository postsRepository; // PostsRepository extends JpaRepository<Posts, Long>
    
    @After
    public void tearDown() throws Exception {
        postsRepository.deleteAll();
    }
    
    @Test
    public void posts_save() throws Exception {
        String title = "title";
        String content = "content";
        
        PostsSaveRequestDTO requestDTO = PostsSaveRequestDTO.builder()
                                                            .title(title)
                                                            .content(content)
                                                            .author("author")
                                                            .build();
        
        String url = "http://localhost:" + port + "/api/v1/posts";
        ResponseEntity<Long> responseEntity = restTemplate.postForEntity(url, requestDTO, Long.class);
        
        assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
        assertThat(responseEntity.getBody()).isGreaterThan(0L);
        
        List<Posts> all = postsRepository.findAll();
        
        assertThat(all.get(0).getTitle()).isEqualTo(title);
        assertThat(all.get(0).getContent()).isEqualTo(content);
    }
}

控制者

@RequiredArgsConstructor
@RestController
public class PostsAPIController {
    private final PostsService postsService;
    
    @PostMapping("/api/v1/posts")
    public Long save(@RequestBody PostsSaveRequestDTO requestDTO) {
        return postsService.save(requestDTO);
    }
    
    @PutMapping("/api/v1/posts/{id}")
    public Long update(@PathVariable Long id, @RequestBody PostsUpdateRequestDTO requestDTO) {
        return postsService.update(id, requestDTO);
    }
    
    @GetMapping("/api/v1/posts/{id}")
    public PostsResponseDTO findById(@PathVariable Long id) {
        return postsService.findById(id);
    }
}

我制作了一个示例Spring Boot测试代码来更新DB,但是如果执行代码,测试失败并显示以下错误消息。我已经定义了spring.security.user.namespring.security.user.password到application.properties文件。

问题是什么?testImplementation 'org.springframework.security:spring-security-test'从build.gradle中删除后,我尝试重新加载,但是没有任何改变。

Expecting:
 <401 UNAUTHORIZED>
to be equal to:
 <200 OK>
but was not.
帕特尔·罗米尔(Patel Romil):

有多种方法可以使用来模拟安全性@WithMockUser, @WithAnonymousUser, @WithUserDetails, @WithSecurityContext您可以将这些注释与@Test方法一起使用。可以根据项目中的需要更改角色。您可能想在这里探索更多细节

@Test
@WithMockUser(username="admin",roles="ADMIN")
public void posts_save() throws Exception {
    String title = "title";
    String content = "content";
    
    PostsSaveRequestDTO requestDTO = PostsSaveRequestDTO.builder()
                                                        .title(title)
                                                        .content(content)
                                                        .author("author")
                                                        .build();
    
    String url = "http://localhost:" + port + "/api/v1/posts";
    ResponseEntity<Long> responseEntity = restTemplate.postForEntity(url, requestDTO, Long.class);
    
    assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
    assertThat(responseEntity.getBody()).isGreaterThan(0L);
    
    List<Posts> all = postsRepository.findAll();
    
    assertThat(all.get(0).getTitle()).isEqualTo(title);
    assertThat(all.get(0).getContent()).isEqualTo(content);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Spring Boot上修复“错误401未经授权”

迁移到Spring Boot 1.5.1和OAuth2 + JWT令牌-未经授权的错误401

Spring Security中的401未经授权的错误

Solr HTTP错误:未经授权(401)

Java Spring 401未经授权

HTTP错误401:未经授权使用urllib.request.urlopen

HTTPError:HTTP错误401:未经授权与python进行sendgrid集成

Django Rest Framework:HTTP 401未经授权的错误

curl请求上的HTTP / 1.1 401未经授权错误-heroku

未经授权 (HTTP 401) Romdbapi

Java:Spring Boot、REST 的单元测试用例中的 401 未经授权的测试用例问题

Spring Security REST-单元测试因HttpStatusCode 401未经授权而失败

使用curl测试时,Grails Spring Security Rest未经授权(401)

Spring Boot Security不会引发401未经授权的异常,但找不到404

当他们尝试在Spring Boot中访问WebApp时如何记录未经授权的用户(401)

Spring Boot Admin Server无法访问端点(未经授权的401)

Spring Security-401未经授权的访问

在Grails应用中使用Spring Security Rest插件调用登录时出现401未经授权的错误

NET核心api的Prometheus返回错误“服务器返回HTTP状态401未经授权”

在NiFi中从Java SDK调用时,Splunk抛出HTTP 401未经授权的错误

使用python查询youtube api的播放列表时出现“ HTTP错误401:未经授权”

Python Linkedin API OAuth2 HTTP错误401:未经授权

如果在未经身份验证的情况下请求uri,如何让spring安全响应未经授权(http 401代码)

401在authenticationManager.authenticate()上未经授权(Spring Security)

Spring Security 401在不安全的端点上未经授权

在401未经授权中发送推送分析API结果

适用于PATCH方法的OAuth 1.0单腿客户端“ HTTP 401未经授权的错误”

如何在Spring Boot Webapp REST API控制器中以未经授权的用户身份发送401,如果数据库查询返回空对象,则发送404?

(401)从SharePoint下载文件时发生未经授权的异常