简体   繁体   English

测试弹簧MVC控制器

[英]Testing spring mvc controller

I am testing my controller using mockito junit framework. 我正在使用Mockito junit框架测试我的控制器。

I got stuck in the controller layer where I get null pointer exception in UserDetails interface. 我被困在控制器层中,在那里我在UserDetails接口中获得了空指针异常。

I tried to override the interface but still I face the problem. 我尝试覆盖该接口,但仍然遇到问题。

This is my default controller only for userDetails interface to get the user information. 这是我的默认控制器,仅用于userDetails界面来获取用户信息。

public class DefaultController {


    public UserDetails getUserDetails(){
        UserDetails userDetails=null;
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (!(auth instanceof AnonymousAuthenticationToken)) {
               userDetails = (UserDetails) auth.getPrincipal();
        }
        return userDetails;
    }

    public Set<Integer> getUserCSRoles(){
        Set<Integer> csroles=new HashSet<Integer>();
        UserDetails userDetails=getUserDetails();
        if(userDetails!=null)
        for (GrantedAuthority grantedAuthority : userDetails.getAuthorities()) {
            if(grantedAuthority.getAuthority().split("_").length>1){
            if(grantedAuthority.getAuthority().split("_")[1].toString().equalsIgnoreCase("MANAGER")){
                csroles.add(1);
            }else if(grantedAuthority.getAuthority().split("_")[1].toString().equalsIgnoreCase("SHAREDSERVICE")){
                csroles.add(2);
            }else if(grantedAuthority.getAuthority().split("_")[1].toString().equalsIgnoreCase("ADMIN")){
                csroles.add(3);
            }else if(grantedAuthority.getAuthority().split("_")[1].toString().equalsIgnoreCase("SUPERADMIN")){
                csroles.add(3);
            }
            }
        }
        return csroles;
    }

This is my managaer controller : 这是我的管理员控制器:

@RequestMapping(value="new",method=RequestMethod.POST)
    public String testMethod(@ModelAttribute("employeeDetails") EmployeeDetails details,HttpSession httpSession, Model model){
        UserDetails userDetails = getUserDetails();
        model.addAttribute("details", details);
        return "redirect:newemployee";
    }

And the for testing the manager this is what I have done: 为了测试经理,这就是我所做的:

@Test
    public void testnewEmployeePost() throws Exception{
        UserDetails userDetails = new UserDetails() {

            @Override
            public boolean isEnabled() {
                // TODO Auto-generated method stub
                return true;
            }

            @Override
            public boolean isCredentialsNonExpired() {
                // TODO Auto-generated method stub
                return true;
            }

            @Override
            public boolean isAccountNonLocked() {
                // TODO Auto-generated method stub
                return true;
            }

            @Override
            public boolean isAccountNonExpired() {
                // TODO Auto-generated method stub
                return true;
            }

            @Override
            public String getUsername() {
                // TODO Auto-generated method stub
                return "nitesh";
            }

            @Override
            public String getPassword() {
                // TODO Auto-generated method stub
                return "nitesh";
            }

            @Override
            public Collection<? extends GrantedAuthority> getAuthorities() {
                GrantedAuthority authority = new GrantedAuthority() {

                    @Override
                    public String getAuthority() {
                        // TODO Auto-generated method stub
                        return "ROLE_USER";
                    }
                };
                List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
                grantedAuthorities.add(authority);
                return grantedAuthorities;
            }
        };

        EmployeeDetails employeeDetails = new EmployeeDetails();
        employeeDetails.setPanCardNo("lower");
        employeeDetails.setFirstName("Nitesh");

        Mockito.when(managerController.getUserDetails()).thenReturn(userDetails);

        mockMvc.perform(post("/manager/new")
                .contentType(MediaType.ALL)
                .sessionAttr("employeeDetails", employeeDetails)
                )   
                .andExpect(model().attribute("employeeDetails", instanceOf(EmployeeDetails.class)));
    }

And the exception thrown is : 抛出的异常是:

java.lang.NullPointerException
    at com.rectrix.ool.controller.DefaultController.getUserDetails(DefaultController.java:24)
    at com.rectrix.ool.test.controller.TestManagerController.testnewEmployeePost(TestManagerController.java:172)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

Kindly guide me to overcome this issue 请指导我克服这个问题

You don't need to create an annonymous UserDetails instance. 您无需创建匿名的UserDetails实例。 You can use User which is an implementation of the UserDetails already available in Spring Security. 您可以使用User ,它是Spring Security中已经可用的UserDetails的实现。 Anyway it is not even required. 无论如何,它甚至不是必需的。 And you are trying to mock the Parent Class DefaultController of the ManagerController . 并且您正在尝试模拟ManagerController的父类DefaultController I have never seen or heard the ability to mock a is a relationship. 我从未见过或听过嘲笑一个人的能力是一种恋爱关系。 What you should do is import dependency 您应该做的是导入依赖

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <version>4.0.4.RELEASE</version>
</dependency>

And rewrite your test as following to mock an authenticated user. 并按照以下步骤重写测试,以模拟经过身份验证的用户。

 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;

    @Test
    public void testnewEmployeePost() throws Exception{


        EmployeeDetails employeeDetails = new EmployeeDetails();
        employeeDetails.setPanCardNo("lower");
        employeeDetails.setFirstName("Nitesh");

        mockMvc.perform(post("/manager/new")
            .with(user("nitesh")
            .password("nitesh")
            .authorities(AuthorityUtils.createAuthorityList("ROLE_USER"))
        .contentType(MediaType.ALL)
        .sessionAttr("employeeDetails", employeeDetails))   
        .andExpect(model().attribute("employeeDetails", instanceOf(EmployeeDetails.class)));
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Spring MVC 控制器测试 PUT - Spring MVC Controller testing PUT Spring MVC测试:控制器方法参数 - Spring MVC Testing: Controller Method Parameters Spring Test MVC:测试控制器,该控制器重定向到另一个控制器 - Spring Test MVC : Testing controller that redirects to another controller 使用spring-test-mvc进行的弹簧控制器单元测试失败 - Spring controller unit testing with spring-test-mvc is failing 使用Spring Mvc测试测试Spring Security Controller - Testing Spring Security Controller Using Spring Mvc Test 集成测试将整个对象发布到 Spring MVC 控制器 - Integration Testing POSTing an entire object to Spring MVC controller Spring MVC - 使用 @WebMvcTest 测试控制器时 @EnableGlobalMethodSecurity 出现错误 404 - Spring MVC - Error 404 with @EnableGlobalMethodSecurity when testing Controller using @WebMvcTest Spring mvc:使用MockMultipartFIle和其他表单数据对控制器进行单元测试 - Spring mvc : Unit testing a controller with MockMultipartFIle and other form data 弹簧mvc控制器的单元测试,整数值为@RequestParam - unit testing for spring mvc controller with Integer value as @RequestParam Spring MVC Controller测试失败-未设置内容类型 - Spring MVC controller testing fails - content type not set
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM