java - Mockito 在使用模拟时抛出 NullpointerException

标签 java junit mockito

我正在尝试为 Web 服务创建测试用例,但出现了 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 发生在“when(FriendRequestService.createFriendRequest(mockedUser, mockedOtherUser)).thenReturn(true);”

我做错了什么?

最佳答案

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

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

首先,你不需要两者都做,要么使用@Mock注解,要么使用mock方法。像这样,您首先分配一个 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);

在执行这个链式调用之前。基于此,您可以指定如何对此模拟实例的调用使用react,例如返回您的用户模拟。

关于java - Mockito 在使用模拟时抛出 NullpointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25912029/

相关文章:

java - TestNG 启动时发生内部错误

java - 从 Cron Job App Engine 调用端点类 - Java

java - void 方法中的 return 语句

java - 为minecraft 1.12 modding搭建编程环境,遇到gradle反编译错误

java - JUnit 测试可以从返回断言的对象解析吗?

java - Mockito 在 void 方法调用上打印消息

java - MyBatis映射@One注解问题

java - 如何动态创建 Spring bean 并在新创建的 bean 上设置注释

java - 如何 stub 一个以泛型类作为参数的方法?

java - mockito 可以抛出一般异常吗