2016-03-31 20 views
0

私はmockito junit frameworkを使ってコントローラをテストしています。spring mvc controllerのテスト

私は、UserDetailsインターフェイスで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))); 
    } 

をそして例外がスローさ 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) 

親切にあなたがAnnonymousのUserDetailsインスタンスを作成する必要はありません。この問題に

+0

何行ですか:24? DefaultControllerで? – VinayVeluri

+0

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

答えて

1

を克服するために私を導きます。 Spring Securityですでに利用可能なUserDetailsの実装であるUserを使用できます。とにかくそれは必要でさえありません。そして、あなたはManagerControllerの親クラスDefaultControllerをモックしようとしています。私は模倣する能力が関係であることを見たことも聞いたこともありません。あなたがすべきことは輸入依存

<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:要求の処理に失敗しました。ネストされた例外はorg.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:965) でjava.lang.NullPointerExceptionが\tであることによって引き起こさ:com.rectrix.ool.controller.DefaultControllerでjava.lang.NullPointerExceptionが \t .getUserDetails(DefaultController.java:24) \t com.rectrix.ool.controller.ManagerController.testMethod(ManagerController.java:547) –

+0

また、私は1つの小さな疑問、円形のビューパスの例外を克服する方法。私のメソッドURLを取得し、文字列を表示する戻り値は同じです。例えば、getメソッドの私のURLが/ manager/newで、戻り文字列がiも/ manager/newのようなものであれば、これはjspに連れて行きそこからpostメソッドにナビゲートします。プロジェクトが開発されて以来、私はURLや戻り文字列を変更することはできませんが、これをどのように克服することができますテストのための問題です。 –

+0

私もstackoverflowでこのクエリを投稿しましたが、私は応答していないようです。親切に助けてください、私のリンクです。 http://stackoverflow.com/questions/36333395/spring-mvc-controller-testing-using-junit-and-mockito-circular-view-path-excep –

関連する問題