0

스프링 캠프 응용 프로그램이 있고 내 단위 테스트를 위해 mockito를 사용합니다. 단위 테스트를 실행할 때 null 포인터 예외가 계속 발생합니다.내 단위 테스트를 실행할 때 java.lang.NullPointerException이 발생합니다.

@Controller 
public class LogInController { 

    @Autowired 
    private MessageSource messageSource; 

    @RequestMapping(method = RequestMethod.POST, value = "/login") 
    public ModelAndView validateViewLogin(@ModelAttribute Person person, 
    BindingResult result, HttpServletRequest request) { 
     ModelAndView mav = new ModelAndView(); 

     String userName = person.getFirstName(); 
     String password = person.getPassword(); 
     boolean isUserValid = false; 
     if (userName != null && password != null) { 
      isUserValid = userManagerService.validateUserLogin(userName,password); 
     } 
     if (!isUserValid) { 
      mav.addObject("failLog",messageSource.getMessage("login.user.fail", new String[] {" ", "" }, request.getLocale())); 
      mav.addObject("isUserValid", false); 
      mav.setViewName("login"); 
      return mav; 
     } 
     mav.addObject("isUserValid", isUserValid); 
     mav.setViewName("home"); 
     return mav; 
    } 

내 단위 테스트를 검색 : :(

이 방법을 검색 할 수 있습니다 내 단위 테스트를 기반으로 할 것

@Test 
public void validateViewLogin_NotValidLogin_returnsLoginPage() { 
    MockHttpServletRequest request = new MockHttpServletRequest(); 
    Person person = new Person(); 
    person.setFirstName("John"); 
    person.setPassword("123"); 
    isUserValid = false; 
    LogInController controller = new LogInController(); 

    // Inject mock user service into controller 
    UserManagerService mockUserService = mock(UserManagerService.class); 
    controller.setUserManagerService(mockUserService); 

    // Configure mock user service to accept the person 
    when(mockUserService.validateUserLogin("John", "123")).thenReturn(
      isUserValid); 

    // Attempt the validation 
    ModelAndView mav = controller 
      .validateViewLogin(person, result, request); 

    // Check the result 
    assertEquals("login", mav.getViewName()); 
} 

스택 추적 오류 메시지를 검색 할 때 위의 단위 테스트를 실행하십시오 :

java.lang.NullPointerException 
at com.gemstone.presentation.LogInController.validateViewLogin(LogInController.java:99) 
at com.gemstone.presentation.LogInControllerTest.validateViewLogin_NotValidLogin_returnsLoginPage(LogInControllerTest.java:79) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
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:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

기본적으로 아래에 표시된 줄 99는 null acco를 반환합니다. 스택 추적을 rding :

mav.addObject(
       "failLog", 
       messageSource.getMessage("login.user.fail", new String[] { 
         " ", "" }, request.getLocale())); 

나는 내 응용 프로그램을 실행할 때 잘 작동하고 failLog 메시지가 내 페이지에 표시되는이 선하시기 바랍니다에 널 포인터를 얻고 왜 어떤 아이디어가?.

미리 감사드립니다.

답변

3

내 생각에 messageSource는 null입니다. 요청을 조롱했지만 messageSource가 아니라 로그인 컨트롤러를 새로 시작하는 곳에서 Spring에 의해 주입되지 않습니다.

실행 중에는 스프링에 의해 자동으로 주입됩니다.

편집 명확히 :

먼저 당신이 테스트를 위해 어떻게 몇 가지를 설정 할 수 있어야합니다.

@Controller 
public class LogInController { 

    @Autowired 
    private MessageSource messageSource; 

    public void setMessageSource(MessageSource ms){ 
     this.messageSource = ms; 
    } 
    // ...... 
} 

그런 다음 테스트뿐만 아니라 변경해야 : 당신은 같은 세터 나에 도착하는 생성자, 추가 할 수 있습니다

@Test 
public void validateViewLogin_NotValidLogin_returnsLoginPage() { 
    MockHttpServletRequest request = new MockHttpServletRequest(); 
    Person person = new Person(); 
    person.setFirstName("John"); 
    person.setPassword("123"); 
    isUserValid = false; 
    LogInController controller = new LogInController(); 

    // Inject mock user service into controller 
    UserManagerService mockUserService = mock(UserManagerService.class); 

      /** ADDED **/ 
      MessageSource ms = mock(MessageSource.class); 

    controller.setUserManagerService(mockUserService); 
      /** ADDED **/ 
      controller.setMessageSource(ms); 

    // Configure mock user service to accept the person 
    when(mockUserService.validateUserLogin("John", "123")).thenReturn(
      isUserValid); 

      /** ADDED **/ 
      when(ms.getMessage("login.user.fail", new String[] {" ", "" }).thenReturn("message"); 

    // Attempt the validation 
    ModelAndView mav = controller 
      .validateViewLogin(person, result, request); 

    // Check the result 
    assertEquals("login", mav.getViewName()); 
} 

그냥 무료로 나눠이, 그래서 확인 I 오타가 없어! 본질적으로 MessageManager는 UserManagerService를 실행 한 것처럼 해보십시오. 결국 인터페이스 일 뿐이며 정확히 같은 방식으로 조롱 될 수 있습니다.

+0

여러분의 반응에 많은 도움이됩니다.하지만 제 경우에는 어떻게 메시지를 모의합니까? 그것은 내 컨트롤러의 메소드가 아니므로 메시지 소스를 추가하는 ModelAndView (mav.addObject())의 메소드입니다. – user1999453

+0

확장 된 답변보기 당신은 다른 것을 조롱하는 것처럼 메시지 소스를 조롱합니다. –

+0

설명에 감사드립니다. – user1999453

관련 문제