簡體   English   中英

Mockito ArgumentCaptor在verify()上給出NullpointerException

[英]Mockito ArgumentCaptor gives NullpointerException on verify()

我目前正在嘗試為我們的Servlet創建測試。 我嘲笑了HttpServletRequestHttpServletResponse和一個充當數據庫處理程序的對象。 doPost方法的測試中,我希望比較Json對象和發送到數據庫對象的ArrayList的值。

servlet:

public class WidgetStatusServlet extends HttpServlet {

private DBController db = new DBController();

    @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("application/json");
    JsonParser parser = new JsonParser();
    JsonElement tradeElement = parser.parse(request.getParameter("widgetdata"));
    JsonArray json = tradeElement.getAsJsonArray();
    Gson gson = new Gson();
    Type listType = new TypeToken<List<WidgetStatus>>() {
    }.getType();
    ArrayList<WidgetStatus> widgets = gson.fromJson(json, listType);

    Iterator<WidgetStatus> iterator = widgets.iterator();
    System.out.println("Widgets");
    while (iterator.hasNext()) {
        WidgetStatus node = (WidgetStatus) iterator.next();
        System.out.println(node);
    }

    db.addWidgetStatus(widgets);

}

考試:

public class WidgetStatusServletTest {

@Captor
private ArgumentCaptor<ArrayList<WidgetStatus>> captor;

private DBController dbMock = mock(DBController.class);
private HttpServletRequest request = mock(HttpServletRequest.class);
private HttpServletResponse response = mock(HttpServletResponse.class);
Repository repository = mock(Repository.class);`


    @Test
public void doPost_ShouldVerifyWidgetsIsProvided() throws Exception {
    final WidgetStatus widget1 = new WidgetStatus("id1", "div_id1", "5", "5", "1", "2", false);
    final WidgetStatus widget2 = new WidgetStatus("id2", "div_id2", "2", "1", "3", "1", true);

    when(request.getParameter("widgetdata")).thenAnswer(new Answer<String>() {
        @Override
        public String answer(InvocationOnMock invocation) throws Throwable {
            ArrayList<WidgetStatus> array = new ArrayList<WidgetStatus>();
            array.add(widget1);
            array.add(widget2);
            String json = new Gson().toJson(array);
            return json;
        }
    });
    new WidgetStatusServlet().doPost(request, response);
    verify(dbMock).addWidgetStatus(captor.capture());
    assertNotNull(captor.getAllValues());


}

當我運行測試時,它NullpointerException上給了我NullpointerException

        verify(dbMock).addWidgetStatus(captor.capture());

我究竟做錯了什么? 我看了幾個與ArgumentCaptor相同用法的例子。 也許這只是一個小錯誤?

如果您使用MockitoJUnitRunner來運行測試,那么將為您創建一個ArgumentCaptor ,並且無需顯式初始化它。 如果你這樣做,那么你也可以使用@Mock注釋創建你的模擬對象,也就是說,你不再需要mock靜態方法了。 然后你的測試類就會這樣開始。

@RunWith(MockitoJUnitRunner.class)
public class WidgetStatusServletTest {

    @Captor private ArgumentCaptor<ArrayList<WidgetStatus>> captor;
    @Mock private DBController mockController;
    @Mock private HttpServletRequest mockRequest;
    @Mock private HttpServletResponse mockResponse;
    @Mock private Repository mockRepository;

此問題解決了是否使用MockitoJUnitRunner或顯式調用MockitoAnnotations.initMocks

只是一個注意事項 - 如果您使用明確表明您的對象是模擬的變量名稱,您的測試方法將更容易閱讀,就像我在這里做的那樣。 否則,在具有許多不同變量的長測試類中,很容易忽略哪些變量引用模擬,哪些變量引用“真實”對象。

標有注釋@Mock@Captor (以及@Spy@InjectMocks )的字段將由Mockito自動初始化,但前提是您在測試類中調用MockitoAnnotations.initMocks(this)

您可以在自己做setUp (JUnit3)或@Before方法(JUnit4),或注釋你的測試用例@RunWith(MockitoJUnitRunner.class)獲得自動初始化和valiidation。

您沒有初始化captor對象,因此無法執行其capture()方法。 您必須在調用其方法之前初始化對象。

似乎ArgumentCaptor沒有初始化。

使用mockito注釋時,它們會被初始化

  • 添加MockitoAnnotations.initMocks(this); 設置方法中的行

      @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); } 
  • 或者通過將@RunWith(MockitoJUnitRunner.class)注釋添加到TestClass中。

暫無
暫無

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

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