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

Spring测试-Mock@Model属性

慕嘉茂
2023-03-14

我有一个RestController,我正试图通过SpringMVC测试来测试它。它包含以下ModelAttribute

    @ModelAttribute("authUser")
    public User authUser(@AuthenticationPrincipal SpringAuthUser springAuthUser) throws Exception {
        User user = ConstantsHome.userprofileMgr.getUserByUserId(springAuthUser.getUsername(), true, true);
        user.updateRights(null);
        request.getSession().setAttribute(ConstantsHome.USEROBJECT_KEY, user);
        return user;
    }

当我对这个RestController运行测试时,我在这个AuthUser方法中得到一个NullPointerExc0019

有没有一种方法可以模拟这个方法,使得模拟的方法被用来代替这个方法进行测试?我已经阅读了关于这个的其他帖子,并认为我可以在测试中传递一个“AuthUser”参数,但这不起作用。最终试图让这个“用户”不要扔NPE...这是我的测试...

    @Test
    public void testGetAllUsers() throws Exception {
        String userJson = AvadaObjectMapper.getMapper().writeValueAsString(new User());
        System.out.println("userJson=" + userJson);
        MvcResult result = this.mockMvc.perform(get("/").param("authUser", userJson).accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
            .andExpect(status().isOk())
            .andExpect(content().contentType("application/json"))
            .andDo(print())
            .andReturn();

        String content = result.getResponse().getContentAsString();

        assertTrue(content.contains("Hello"));
    }

共有1个答案

郑胡媚
2023-03-14

我能够通过下面的测试配置类让我的AuthUser工作。请特别注意. defaultRequest...行,因为这是建立授权用户的地方。我在所有测试中使用下面的类作为@ContextConfiguration类。

import com.avada.rest.api.users.UserService;
import com.avada.rest.api.users.TestUserService;
import com.avada.rest.security.SpringAuthUser;

import java.util.HashSet;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors;
import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

@Configuration
@ComponentScan(excludeFilters={
                @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=UserService.class)
              })
public class TestSpringRestConfig {

    public static final SpringAuthUser AUTH_USER =
        new SpringAuthUser("test", "test",
            new HashSet<GrantedAuthority>() {{
                add(new SimpleGrantedAuthority("ROLE_ADMIN"));
            }}
        );

    @Bean
    public UserService userService() {
        return new TestUserService();
    }

    @Bean
    public MockMvc mockMvc(WebApplicationContext wac) {
          return MockMvcBuilders
                 .webAppContextSetup(wac)
                 .defaultRequest(MockMvcRequestBuilders.get("/").with(SecurityMockMvcRequestPostProcessors.user(AUTH_USER)))
                 .apply(SecurityMockMvcConfigurers.springSecurity())
                 .build();
    }
}
 类似资料:
  • 我正在处理一个Spring 3项目,并且总是检查@ModelAt0016是否为空,如果是,我将用户重定向到错误页面。 我想知道的是这张支票是否必要。该命令是会话属性,必要时使用控制器的“填充”方法创建。因此,只要会话处于活动状态,该命令就永远不能为null。 我不知道会话过期时会发生什么。控制器是否再次创建模型属性?如果是这样,那么无论会话的状态如何,命令对象永远不能为null。 谢谢你的帮助。

  • 我对@modeldattribute的用法有问题。 具有具有以下上下文的简单Spring(3.2.11)mvc应用程序: 有两个DTO:PageDTO和SessionTo,这两个DTO内部完全相同,只包含一个属性-地址和get/set方法。 有一个地址orm.jsp一个表格: 有控制器的: 问题来了。当我提交地址表单时,两个DTO都会用表单中的数据填充。我希望只填充jsp中表单标记中提到的带有“p

  • 本文向大家介绍详解Spring MVC如何测试Controller(使用springmvc mock测试),包括了详解Spring MVC如何测试Controller(使用springmvc mock测试)的使用技巧和注意事项,需要的朋友参考一下 在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvc mock直接测试controller层代码。 1

  • 本节介绍与jQuery Framework相关的各种模拟测试。 您可以在本地计算机上下载这些示例模拟测试,并在方便时离线解决。 每个模拟测试都提供一个模拟测试密钥,让您自己验证最终得分和评分。 jQuery Mock Test I 问题1 - 关于jQuery,以下哪项是正确的? A - jQuery是一个快速而简洁的JavaScript库,由John Resig在2006年创建,有一个很好的座右

  • 本节介绍与Apache POI相关的各种模拟测试。 您可以在本地计算机上下载这些示例模拟测试,并在方便时离线解决。 每个模拟测试都提供一个模拟测试密钥,让您自己验证最终得分和评分。 Apache POI Mock Test I 问题1 - 关于Apache POI的HSSF组件,以下哪项是正确的? A - 用于读取和写入MS-Excel文件的xls格式。 B - 用于MS-Excel的xlsx文件