当前位置: 首页 > 知识库问答 >
问题:

@WithMockUser在集成测试中不工作-Spring Boot

丌官绍元
2023-03-14

尽管我的测试方法被@WithMockUser注释,但我仍然被拒绝访问。为什么这在集成测试中不起作用?使用@webappconfiguration和mockmvc进行测试一切都很好。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class FileUploadIntegrationTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @MockBean
    private FileStorageService storageService;

    @Test
    public void classPathResourceTest() throws Exception {
        ClassPathResource resource = new ClassPathResource("/test/testFile.txt", getClass());
        assertThat(resource.exists(), is(true));
    }

    @Test
    @WithMockUser(username="tester",roles={"USER"})
    public void shouldUploadFile() throws Exception {
        ClassPathResource resource = new ClassPathResource("/test/testFile.txt", getClass());

        MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
        map.add("file", resource);
        ResponseEntity<String> response = this.restTemplate.postForEntity("/files", map, String.class);

//        assertThat(response.getStatusCode(), is(HttpStatus.OK));
        then(storageService).should().addFile((any(String.class)), any(MultipartFile.class));
    }
}
@RestController
@RequestMapping("/files")
@PreAuthorize(value = "hasRole('ROLE_USER')")
public class FileUploadController {

    private FileStorageService fileStorageService;
    private AuthenticationFacade authenticationFacade;

    @Autowired
    public FileUploadController(FileStorageService fileUploadService, AuthenticationFacade authenticationFacade) {
        this.fileStorageService = fileUploadService;
        this.authenticationFacade = authenticationFacade;
    }

    @ResponseBody
    @PostMapping
    public ResponseEntity<UUID> uploadFile(@RequestParam("file") MultipartFile file) {
        UUID uuid = this.fileStorageService.addFile(authenticationFacade.getAuthentication().getName(), file);
        if (uuid != null) return ResponseEntity.ok(uuid);
        else return (ResponseEntity<UUID>) ResponseEntity.badRequest();
    }

}

共有1个答案

谭伟
2023-03-14

无法使用@WithMockUser解决此问题。

您可以尝试使用这里描述的配置文件方法:https://stackoverflow.com/a/35192495/3010484。

 类似资料:
  • 我正在为我的应用程序编写单元测试,我在服务内部执行的步骤之一是从SpringSecurityContext获取当前经过身份验证的用户。 我知道,如果我想模拟Spring Security Authentication,我可以使用@SusMockUser,但它对我不起作用,因为当测试方法到达getAuthentication()方法调用时,它总是返回null... 我已经搜索了很多问题和博客帖子,但

  • 我正在使用cucumber测试来测试我的Spring启动应用程序,启用了Spring安全。除了当我用cucumber测试一些使用Spring安全的测试时,事情运行得很好。 失败。如果我像简单的jUnit测试那样隐蔽地运行它们,这些测试确实有效,但是当使用cucumber测试步骤运行时失败了。当我用cucumber测试运行同样的测试时,这个问题看起来像是Spring安全测试模拟行为没有被应用。 我的

  • 我有一个用selenium进行单元测试和集成测试的项目。 当我用IntelliJ执行cucumber集成测试时,它工作得很好,您可以看到: 用Intellij执行cucumber集成测试 但是,当我执行mvn集成测试时,似乎没有发现任何联调: 故障保护输出 我定义了以下POM: > 文件夹结构是文件夹结构 mvn集成-测试输出https://drive . Google . com/file/d/

  •  Selenium 能被选为最好集成测试、回归测试方案,是因为: 1.Selenium IDE ,一个FireFox plugin,能自动记录用户的操作,生成测试脚本。 2. 生成的测试脚本可以用Selenium Core手工执行,也能基于Selenium RC放入Java,C#,Ruby的单元测试用例中自动运行。 3. 测试用例调用实际的浏览器(如IE、FireFox)来执行测试。和有些开源方案

  • 我试图用内存中的H2 DB测试某些实体的持久性,但我认识到无论是在构建平台上运行还是在运行RunAs时,都不会按应有的方式被调用- 我可以肯定的是,序列是在H2 DB内部生成的。当我连接到这个生成的H2时,我甚至可以选择它们。所以这绝对不是H2内部的问题,而是Hibernate的问题。(通常Hibernate会在持久化需要ID的实体时自动分配ID)。 实体 引用实体中的引用。。。 持久性单位...