簡體   English   中英

Mockito 在使用模擬時拋出 NullpointerException

[英]Mockito throwing a NullpointerException on using a mock

我正在嘗試為 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);

在執行此鏈接調用之前。 基於此,您可以指定如何響應對此模擬實例的調用,例如返回您的用戶模擬。

而不是調用initMocks ,您可能需要使用@RunWith(MockitoJUnitRunner.class)對您的FriendWebServiceTest類進行注釋。

您還可以嘗試將@RunWith(MockitoJUnitRunner.class)@ExtendWith(MockitoExtension.class)注釋分別添加到 JUnit4 和 JUnit5 的FriendWebServiceTest類中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM