猿问

注释和方法调用之间的 Mockito 区别

我有一个关于在 Java 中使用 Mockito 的问题。我将附上 2 块类似的代码:第一个,效果很好


package controller;


import model.DatabaseModel;

import org.json.JSONArray;

import org.json.JSONObject;

import org.junit.Before;

import org.junit.Test;

import org.mockito.InjectMocks;

import org.mockito.Mock;

import org.mockito.MockitoAnnotations;


import java.util.ArrayList;


import static org.junit.Assert.assertEquals;

import static org.mockito.Mockito.when;


public class TestController {


    JSONObject jsonObj1;

    JSONArray testArr;

    @Mock

    private DatabaseModel testDB;


    @InjectMocks

    private Controller controller;


    @Before

    public void setup() {

        MockitoAnnotations.initMocks(this);

        jsonObj1 = new JSONObject();

        jsonObj1.put("name", "Bar");

        testArr = new JSONArray();

        testArr.put(jsonObj1);

        when(testDB.getActivites()).thenReturn(testArr);

    }


    @Test

    public void testServerCon() {

        ArrayList<String> testServer = new ArrayList<>();

        testServer.add("Bar");

        assertEquals(testServer, controller.getAllActivites());

    }

}

第二个,它并没有真正起作用:


package controller;


import model.DatabaseModel;

import org.json.JSONArray;

import org.json.JSONObject;

import org.junit.Before;

import org.junit.Test;

import org.mockito.InjectMocks;

import org.mockito.Mock;

import org.mockito.MockitoAnnotations;


import java.util.ArrayList;


import static org.junit.Assert.assertEquals;

import static org.mockito.Mockito.*;


public class TestController2 {

    JSONObject jsonObj1;

    JSONArray testArr;

    DatabaseModel testDB;

    Controller controller;


    @Before

    public void setup() {


        jsonObj1=new JSONObject();

        jsonObj1.put("name", "Bar");

        testArr=new JSONArray();

        testArr.put(jsonObj1);

        controller=new Controller();

        testDB=mock(DatabaseModel.class);

        when(testDB.getActivites()).thenReturn(testArr);

        verify(testDB).getActivites();


    }


当我对第二个使用 verify 方法时,我收到一个错误,该方法从未在模拟上被调用,所以我想知道我错过了什么?我在网上查了教程,有些使用注释,有些使用方法调用,但是如果我没记错的话,它们应该是相同的,那么我在这里缺少什么?


跃然一笑
浏览 118回答 2
2回答

MMTTMM

在您的第一个示例中,@InjectMocks注释导致的实例Controller被注入mocked DatabaseModel。在你的第二个例子中,你构造了Controller这样的......controller=new Controller();...但是您永远不会将模拟注入Database Model到Controller. 所以,当你调用controller.getAllActivites()你的控制器时,永远不要使用模拟的DatabaseModel. 如果您可以DatabaseModel将Controller. 例如:testDB=mock(DatabaseModel.class);// constructor injectioncontroller=new Controller(testDB);// setter injectioncontroller=new Controller();controller.setDatabaseModel(testDB);注意:即使您verify(testDB).getActivites()从 setup 方法中删除,除非您实际将模拟对象提供DatabaseModel给controller.

LEATH

您正在第二版verify中的方法中执行...setup@Beforepublic void setup() {&nbsp; &nbsp; jsonObj1=new JSONObject();&nbsp; &nbsp; jsonObj1.put("name", "Bar");&nbsp; &nbsp; testArr=new JSONArray();&nbsp; &nbsp; testArr.put(jsonObj1);&nbsp; &nbsp; controller=new Controller();&nbsp; &nbsp; testDB=mock(DatabaseModel.class);&nbsp; &nbsp; when(testDB.getActivites()).thenReturn(testArr);&nbsp; &nbsp; verify(testDB).getActivites(); // REMOVE THIS LINE}此时不会调用任何内容,因此会出现错误。您可能想将此行移到您的测试方法中,例如...@Testpublic void testServerCon(){&nbsp; &nbsp; ArrayList<String> testServer=new ArrayList<>();&nbsp; &nbsp; testServer.add("Bar");&nbsp; &nbsp; assertEquals(testServer, controller.getAllActivites());&nbsp; &nbsp; verify(testDB).getActivites();}
随时随地看视频慕课网APP

相关分类

Java
我要回答