4

注入された依存関係を持つコントローラクラスの統合テストを作成しようとしています。私は注入されたオブジェクトを介してメソッドを呼び出すコントローラの部分をテストしようとしますが、nullポインタの例外が原因でテストが失敗してしまいます。テストでは、@ContexConfigurationと@RunsWithアノテーションを使用しましたが、それは役に立ちませんでした。いくつかのコードが役立つかもしれない :)依存関係注入を伴うコントローラのSpring統合テスト

AuthenticationController:

テストのcontext.xmlで
@Controller 
public class AuthenticationController { 

    @Resource(name = "userManagement") 
    private UserManagement um; 


    @RequestMapping(method = RequestMethod.POST) 
    public String onSubmit(@ModelAttribute("user") UserForm user, 
      BindingResult result, Model model, HttpSession session) { 

     LoginFormValidator validator = new LoginFormValidator(); 
     validator.validate(user, result); 
     if (result.hasErrors()) { 
      return "login"; 
     } else { 
      User u = um.login(user.getEmail(), user.getPwd()); 
      if (u != null) { 
       session.setAttribute("user", u); 
       LOGGER.info("succesful login with email: " + u.getEmail()); 
       model.addAttribute("result", "succesful login"); 
      } else { 
       model.addAttribute("result", "login failed"); 
      } 
      return "result"; 
     } 
    } 

beans:bean id="userManagement" class="my.packages.UserManagement"

AuthenticationControllerTest:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"test-context.xml" }) 
public class AuthenticationControllerTest { 

    private MockHttpServletRequest request; 
    private MockHttpServletResponse response; 
    private AuthenticationController controller; 

    @Before 
    public void setUp() { 
     request = new MockHttpServletRequest(); 
     response = new MockHttpServletResponse(); 
     controller = new AuthenticationController(); 
    } 

    @Test 
    public void testLoginPost() throws Exception { 
     request.setMethod("POST"); 
     request.setRequestURI("/login"); 
     request.setParameter("email", "[email protected]"); 
     request.setParameter("pwd", "test"); 
     final ModelAndView mav = new AnnotationMethodHandlerAdapter() 
       .handle(request, response, controller); 
     final UserForm u = 
       assertAndReturnModelAttributeOfType(mav, "user", UserForm.class); 
     assertEquals("[email protected]", u.getEmail()); 
     assertEquals("test", u.getPwd()); 
     assertViewName(mav, "result"); 

     /* if UserForm is not valid */ 
     final BindingResult errors = assertAndReturnModelAttributeOfType(mav, 
       "org.springframework.validation.BindingResult.user", 
       BindingResult.class); 
     assertTrue(errors.hasErrors()); 
     assertViewName(mav, "login"); 
    } 

スタックトレースは、エラーが発生したことを私に伝えますこのテストでは、注入されたuserMangaementオブジェクトのloginメソッドが呼び出されます。 um = nullのため、注入がテストでは機能しません。 コントローラーは使用時に正常に動作します。

コメントは多分助けになるでしょう!事前に

おかげで、

Sorex

答えて

4

あなたはこのようなあなたのコントローラを作成することはできませんautowire依存関係が必要な場合:

controller = new AuthenticationController(); 

あなたは、あなたのテストに依存関係autowireでき

@Autowired 
private UserManagement um; 

あなたのコントローラにコンストラクタを作成してそれを行うことができますこれは:

@Before 
public void setUp() { 
    controller = new AuthenticationController(um); 
} 

しかし、私はMockServletContextの使用をお勧めします。

MockServletContext mockServletContext = new MockServletContext(); 
mockServletContext.addInitParameter("contextConfigLocation", "path to your xml config")); 
ContextLoaderListener listener = new ContextLoaderListener(); 
listener.initWebApplicationContext(mockServletContext); 

DispatcherServletについても参照する必要があります。私はサーブレット環境でこれをやったことはありませんが、春のポートレットMVCでしかあ​​りませんが、それは類似しています。アイデアは、偽のWebアプリケーションのコンテキストを作成し、ディスパッチャサーブレットを呼び出すことで、コントローラ間の完全な統合テストをバネ構成にすることです。

関連する問題