2016-03-31 19 views
0

Denetleyicimi mockito junit framework kullanarak test ediyorum.Test yayı mvc denetleyicisi

UserDetails arabiriminde null pointer istisnası aldığım denetleyici katmanında takılı kaldım.

Arabirimi geçersiz kılmaya çalıştım ancak yine de sorunla karşılaşıyorum.

Bu, yalnızca kullanıcı bilgileri almak için userDetails arabirimi için varsayılan denetleyicim'dur. Bu benim yaptığım budur

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

Ve yöneticisini test:

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

Bu benim managaer denetleyicisi olan

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

Ve atılan istisna :

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) 
Lütfen bu konuyu Bir annonymous UserDetails örneğini oluşturmak gerekmez

+0

Satır nedir: 24? DefaultController içinde? – VinayVeluri

+0

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

cevap

1

aşmak için bana yol. Spring Security'de zaten mevcut olan UserDetails'un bir uygulaması olan User'u kullanabilirsiniz. Her neyse, hatta gerekli değildir. Ve ManagerController'un DefaultController numaralı Ebeveyn Sınıfı ile alay etmeye çalışıyorsunuz. Ben alama yeteneğini hiç görmedim ya da duydum bir ilişkidir. Yapman gereken ithalat bağımlılığı

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

Ve doğrulanmış bir kullanıcı alay aşağıdaki gibi testini yeniden yazmak.

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

Şimdi de söylediğin gibi yaptım, hala aşağıda gösterildiği gibi aynı boş gösterici hatası buldum. org.springframework.web.util.NestedServletException: İstek işleme başarısız; İç içe istisna org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:965) de java.lang.NullPointerException \t olduğunu Nedeni: com.rectrix.ool.controller.DefaultController at java.lang.NullPointerException \t .getUserDetails (DefaultController.java:24) \t com.rectrix.ool.controller.ManagerController.testMethod (ManagerController.java:547) –

+0

Ayrıca bir küçük şüphe, Dairesel görünüm yolu istisnasının üstesinden nasıl geleceğim. Alma yöntemim URL'si ve görünüm dizgisi aynıdır. Mesela, get metodumun/manager/new isimli urlüm ve iadenin de aynı/new/new ile aynı olması durumunda, bu jsp'ye götürür ve oradan post yöntemine giderdi. Proje geliştirildiğinden, url veya dönüş dizgisini değiştiremiyorum, ancak şimdi bunun üstesinden nasıl gelebilirim test etmek için sorun. –

+0

Bu sorguyu da stackoverflow'ta yayınladım, ancak yanıt vermiyor gibi görünüyor. nazik yardım ve benim bağlantım. http://stackoverflow.com/questions/36333395/spring-mvc-controller-testing-using-junit-and-mockito-circular-view-path-excep –

İlgili konular