2014-09-18 6 views
3

Я пытаюсь создать тестовые примеры для веб-службы, но я получаю nullpointerexception. Это веб-сервис:Mockito бросает исключение NullpointerException при использовании макета

@Path("friendservice") 
public class FriendWebService { 

private static final Logger logger = Logger.getLogger(FriendWebService.class); 

@EJB 
private FriendRequestServiceInterface friendRequestService; 

@GET 
@Path("friendrequest") 
@Produces(MediaType.TEXT_PLAIN) 
public String createFriendRequest(
     @Context HttpServletRequest request) { 
    logger.info("createFriendRequest called"); 

    String result = "false"; 
    User user = (User) request.getSession().getAttribute("user"); 
    User otherUser = (User) request.getSession().getAttribute("profileuser"); 
    if ((user != null) && (otherUser != null)) { 
     logger.info("Got two users from session, creating friend request."); 
     if (friendRequestService.createFriendRequest(user, otherUser)) { 
      result = "true"; 
     } 
    } 
    return result; 
} 

}

Это мой тестовый класс:

public class FriendWebServiceTest { 
@Mock 
FriendRequestServiceInterface FriendRequestService; 
@Mock 
Logger mockedLogger = mock(Logger.class); 
@Mock 
HttpServletRequest mockedRequest = mock(HttpServletRequest.class); 
@Mock 
HttpSession mockedSession = mock(HttpSession.class); 
@Mock 
User mockedUser = mock(User.class); 
@Mock 
User mockedOtherUser = mock(User.class); 
@InjectMocks 
FriendWebService friendWebService = new FriendWebService(); 

@Before 
public void setUp() throws Exception { 

} 

@Test 
public void testCreateFriendRequest() throws Exception { 
    when(mockedRequest.getSession()).thenReturn(mockedSession); 
    when(mockedSession.getAttribute("user")).thenReturn(mockedUser); 
    when(mockedSession.getAttribute("profileuser")).thenReturn(mockedOtherUser); 
    when(FriendRequestService.createFriendRequest(mockedUser, mockedOtherUser)).thenReturn(true); 
    assertTrue(friendWebService.createFriendRequest(mockedRequest) == "true"); 
} 

NullPointerException происходит «, когда (FriendRequestService.createFriendRequest (mockedUser, mockedOtherUser)) thenReturn (. правда);"

Что я делаю неправильно?

ответ

8

Вы метод цепочек вызовов на вашем издевались, например:

@Mock 
HttpServletRequest mockedRequest = mock(HttpServletRequest.class); 

Прежде всего, вам не нужно делать так, либо использовать @Mock аннотацию или метод mock. Таким образом, вы сначала назначаете Mock, а затем заменяете этот экземпляр другим макетом. Я рекомендую аннотацию, поскольку она добавляет некоторый контекст для макета, такого как имя поля. Это может привести к уже ваше NullPointerException как вы, однако никогда не активировать аннотаций по телефону:

MockitoAnnotations.initMocks(this); 

как вы не издеваться, следовательно все экземпляры с обеих мер до сих пор. Однако даже это приведет к дальнейшему возникновению вашего исключения, поэтому давайте двигаться вперед.

В friendWebService.createFriendRequest(mockedRequest) вы звоните:

User user = (User) request.getSession().getAttribute("user"); 
User otherUser = (User) request.getSession().getAttribute("profileuser"); 

где вы вызываете метод на двух издевается, для которых вы не указали никакого поведения. Эти mocks делают тогда по умолчанию возвращение null. Для этого необходимо указать следующие действия:

when(request.getSession()).thenReturn(myMockedSession); 

перед выполнением этого прикованного вызова. Основываясь на этом, вы можете указать, как реагировать на вызовы на этом издеваемом экземпляре, например, возвращать пользовательские mocks.

+0

Я пробовал использовать только аннотации Mock, но при этом возникает ошибка «когда (mockedRequest.getSession()). ThenReturn (mockedSession);» но эта проблема исчезает, когда вы используете метод mock(). Я использую метод mock и удаляю аннотации, но я хочу знать, почему аннотации терпят неудачу. –

+1

Вы назвали 'MockitoAnnotations.initMocks (this);' в какой-то момент? –

Смежные вопросы