[英]Using mockito to mock AsyncTask results in 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.