2016-03-31 3 views
0

Я тестирую свой контроллер, используя mockito junit framework.Тестирование весны mvc-контроллер

Я застрял в слое контроллера, где я получаю исключение из null-указателя в интерфейсе 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; 
    } 

Это мой managaer контроллер:

@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"; 
    } 

И для тестирования менеджера это то, что я сделал:

@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))); 
    } 

И исключение брошено есть:

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) 

Просьба направлять мне преодолеть эту проблему

+0

Что такое линия: 24? в DefaultController? – VinayVeluri

+0

if (! (Auth instanceof AnonymousAuthenticationToken)) { line 24: \t userDetails = (UserDetails) auth.getPrincipal(); \t \t} \t \t return userDetails; –

ответ

1

Вам не нужно создавать annonymous UserDetails экземпляр. Вы можете использовать User, который представляет собой реализацию UserDetails, уже доступного в Spring Security. Во всяком случае, это даже не требуется. И вы пытаетесь издеваться над родительским классом DefaultController из ManagerController. Я никогда не видел и не слышал, что способность насмехаться - это отношения. То, что вы должны сделать, это зависимость от импорта

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

и переписать тест следующим образом издеваться аутентификацией пользователя.

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))); 
    } 
+0

Я сделал так же, как вы сказали сейчас, но я нашел ту же ошибку с нулевым указателем, как показано ниже. org.springframework.web.util.NestedServletException: обработка запроса не удалась; вложенное исключение составляет java.lang.NullPointerException \t в org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:965) Вызванный: java.lang.NullPointerException \t в com.rectrix.ool.controller.DefaultController .getUserDetails (DefaultController.java:24) \t at com.rectrix.ool.controller.ManagerController.testMethod (ManagerController.java:547) –

+0

Я также мало сомневаюсь, как преодолеть исключение кругового пути просмотра. Мой метод get url и возвращаемая строка для просмотра одинаковы. Например, если мой url метода get -/manager/new, а возвращаемая строка iis тоже такая же, как/manager/new, это приведет меня к jsp и перейдите к методу post оттуда. Поскольку проект разработан, я не могу изменить URL-адрес или строку возврата, но теперь, как я могу это преодолеть, это проблема для тестирования. –

+0

Я также разместил этот запрос в stackoverflow, но я не вижу ответа. любезную помощь, и вот моя ссылка. http://stackoverflow.com/questions/36333395/spring-mvc-controller-testing-using-junit-and-mockito-circular-view-path-excep –