Mockito在使用模拟时抛出NullpointerException

时间:2014-09-18 11:58:42

标签: java junit 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(true);"

我做错了什么?

3 个答案:

答案 0 :(得分:9)

您在模拟的实例上链接方法调用:

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

首先,您不需要同时使用@Mock注释或mock方法。像这样,你首先分配一个模拟,然后用另一个模拟替换这个实例。我建议使用注释,因为它会为模拟添加一些上下文,例如字段的名称。这可能已经导致您的NullPointerException因为您从未通过调用:

来激活注释
MockitoAnnotations.initMocks(this);

因为到目前为止你没有用两种方法模拟所有实例。但是,即使这样做也会导致你的例外,所以让我们继续前进。

friendWebService.createFriendRequest(mockedRequest)内你打电话:

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

在两个模拟中调用方法,而您没有指定任何行为。默认情况下,这些模拟会返回null。您需要为此指定行为,例如:

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

在执行此链接呼叫之前。基于此,您可以指定如何对此模拟实例上的调用作出反应,例如返回用户模拟。

答案 1 :(得分:1)

您可能需要使用initMocks@RunWith(MockitoJUnitRunner.class)课程进行注释,而不是调用FriendWebServiceTest

答案 2 :(得分:1)

您还可以尝试分别为 JUnit4 和 JUnit5 添加 @RunWith(MockitoJUnitRunner.class)@ExtendWith(MockitoExtension.class) 注释到您的 FriendWebServiceTest 类。