Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito ArgumentCaptor在verify()上提供NullpointerException_Java_Unit Testing_Servlets_Junit_Mockito - Fatal编程技术网

Java Mockito ArgumentCaptor在verify()上提供NullpointerException

Java Mockito ArgumentCaptor在verify()上提供NullpointerException,java,unit-testing,servlets,junit,mockito,Java,Unit Testing,Servlets,Junit,Mockito,我目前正在尝试为我们的servlet创建测试。我模拟了HttpServletRequest,HttpServletResponse和一个用作数据库处理程序的对象。在对doPost方法的测试中,我希望比较Json对象和发送到数据库对象的ArrayList中的值 servlet: public class WidgetStatusServlet extends HttpServlet { private DBController db = new DBController(); @Ove

我目前正在尝试为我们的servlet创建测试。我模拟了
HttpServletRequest
HttpServletResponse
和一个用作数据库处理程序的对象。在对
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);

}

我做错了什么?我已经看了几个使用相同的
ArgumentCaptor
的例子。可能这只是一个小错误?

您没有初始化
captor
对象,因此无法执行其
capture()
方法。在调用对象的方法之前,必须初始化对象。

标记有注释的字段
@Mock
@Captor
(以及
@Spy
@InjectMocks
)将由Mockito自动初始化,但只有在调用测试类时才会初始化


您可以在
setUp
(JUnit3)或
@Before
方法(JUnit4)中自己完成,或者使用
@RunWith(MockitoJUnitRunner.class)
注释您的测试用例,以获得自动初始化和有效性。

如果您使用
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;
@RunWith(MockitoJUnitRunner.class)
公共类WidgetStatusServletTest{
@Captor private ArgumentCaptor解决了是使用
MockitoJUnitRunner
还是显式调用
MockitoAnnotations.initMocks
的问题


请注意,如果像我在这里所做的那样,使用清楚地表明对象是mock的变量名,您的测试方法将更容易阅读。否则,在一个包含许多不同变量的长测试类中,很容易忘记哪些变量引用mock,哪些引用“real”对象。

似乎未初始化
参数捕获器

当使用mockito注释时,它们由

  • 在中添加
    MockitoAnnotations.initMocks(this);
    行 设置方法

     @Before
     public void setUp() throws Exception {
    
         MockitoAnnotations.initMocks(this);
     }
    
  • 或者通过向TestClass添加
    @RunWith(MockitoJUnitRunner.class)
    注释


好的,现在我在同一行遇到了以下失败:需要但未调用:mockController.addWidgetStatus();->位于com.mycompany.bachelorprosjekt2014.servlets.WidgetStatusServletTest.doPost\u应该验证widgetsisprovided(widgetstatusservletest.java:70)实际上,与此模拟没有任何交互。您的问题是您的
WidgetStatusServlet
有自己的
DBController
,这与您创建的模拟不同。如果您希望此测试正常工作,您需要提供一种方法,将您的模拟
DBController
注入
WidgetStatusServlet
。我想我明白了。你是说我必须在调用doPost()之前将mockController注入servlet?
@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;
 @Before
 public void setUp() throws Exception {

     MockitoAnnotations.initMocks(this);
 }