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

在REST控制器上执行单元测试时,Spring安全性会导致问题

汪庆
2023-03-14

所以基本上我在我的rest控制器上做了一些单元测试,在使用Spring Security之前,一切都很顺利,在添加它并将Spring Security设置到我的mockmvc后,它总是返回302,其他什么都没有,在修改我的代码和浏览器后,我发现在登录后,我确实收到了302代码,这是因为重定向,我的配置中的loginProcessingUrl似乎导致了以下情况:

我的Spring安全配置:

 @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
                .loginPage("/showMyLoginPage")
                .loginProcessingUrl("/authenticateTheUser")
                .permitAll()
                .and()
                .logout()
                .logoutSuccessUrl("/")
                .logoutUrl("/logoutUser")
                .and()
                .csrf()
                .disable();
    }

我正在测试的REST方法:

    @GetMapping(path = "/list/getProducts")
    public String getProducts()
    {
        List<Product> products = productService.getProducts();
        return gson.toJson(products);
    }

最后是我的测试:

@RunWith(SpringRunner.class)
@ContextConfiguration(locations = "file:src/test/java/resources/ProductCRUD-servlet.xml")
@WebAppConfiguration
public class ProductControllerTest
{

    @Autowired
    WebApplicationContext context;

    @InjectMocks
    private ProductRestController productRestController;

    @Mock
    private ProductService productService;

    private MockMvc mockMvc;

    @Before
    public void setup()
    {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders
                .webAppContextSetup(context)
                .apply(springSecurity())
                .build();
    }

    @Test
    public void getAllProductsTest() throws Exception
    {
        List<Product> products = new ArrayList<>();
        products.add(new Product("4532", 123, "Product test", "test"));
        Mockito.when(productService.getProducts())
                .thenReturn(products);
        mockMvc.perform(MockMvcRequestBuilders
                .get("/product/list/getProducts"))
                .andExpect(status().isOk)
                .andExpect(content().string(containsString("\"productId\":\"4534\"")));    
    }

所以现在发生的事情是,即使我的网站正在工作,我正在检索我的json,登录过程不知怎么搞砸了我的测试。

即使我将测试状态代码设置为302而不是200,它也不会返回任何内容。

Expected :a string containing "\"productId\":\"4534\""
Actual   :""

TLDR:在测试受Spring Security保护的REST api时,我无法通过测试访问api。

共有1个答案

冯通
2023-03-14

对于Spring Security集成测试,我们可以使用@SusMockUser作为11.测试方法安全性(当前的Spring-安全指南)提出的方法。

然而,测试“受限场景”也很好,我们将提供未经授权/忽略/匿名用户,并断言相应的反应(异常、http代码、重定向等)。

 类似资料:
  • 我正在测试家庭控制器 我使用spring security作为用户名“user”,默认情况下作为密码进行测试,但@PreAuthorize不起作用 的结果 预期结果: 实际结果: 我错过了什么吗?

  • 本文向大家介绍Spring Boot Rest控制器单元测试过程解析,包括了Spring Boot Rest控制器单元测试过程解析的使用技巧和注意事项,需要的朋友参考一下 Spring Boot提供了一种为Rest Controller文件编写单元测试的简便方法。在SpringJUnit4ClassRunner和MockMvc的帮助下,可以创建一个Web应用程序上下文来为Rest Controll

  • 我有两个控制器,一个用于用户,一个用于角色。我已经为用户控制器编写了测试,但是当我尝试运行测试时,它会给我以下错误: "由以下原因引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的'uk.co.circuare.cube.service.user.repository.RoleRepository'类型的

  • 我的应用程序有Spring boot 1.3.2,我正在尝试将Spring MVC与Spring Security结合使用。 我有管理小组http://localhost:8080/admin和我的普通用户页面内容http://localhost:8080/ 如果你试图打开一个管理面板(http://localhost:8080/admin)你必须登录,如果你是常见的只需输入http://loca

  • 我试图使用mockmvcbuilders.standalonesetup方法为一个spring mvc rest控制器创建一个非常基本的单元测试。我一直收到一个404错误。下面列出了测试应用程序上下文、测试类、控制器和整个堆栈跟踪。欢迎任何指导。 java.lang.AssertionError:状态应为:<200>但实际为:<404>在org.springframework.test.util.

  • 我已经开始学习OAuth2 spring安全从一个星期,所以对不起,如果问题是容易的。在我开始研究之前,这个话题对我来说似乎很容易。我将在应用程序中为Restendpoint编写测试。为了做到这一点,我将为我的资源类编写测试。但我的应用程序使用的是OAuth2。 第一个想法是配置单独的授权服务器,扩展AuthorizationServerConfigurerAdapter用于此测试。我已经将Cli