为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

跃然一笑 2022-07-20 20:19:47
我有一个关于在 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 方法时,我收到一个错误,该方法从未在模拟上被调用,所以我想知道我错过了什么?我在网上查了教程,有些使用注释,有些使用方法调用,但是如果我没记错的话,它们应该是相同的,那么我在这里缺少什么?
查看完整描述

2 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

在您的第一个示例中,@InjectMocks注释导致的实例Controller被注入mocked DatabaseModel。


在你的第二个例子中,你构造了Controller这样的......


controller=new Controller();

...但是您永远不会将模拟注入Database Model到Controller. 所以,当你调用controller.getAllActivites()你的控制器时,永远不要使用模拟的DatabaseModel. 如果您可以DatabaseModel将Controller. 例如:


testDB=mock(DatabaseModel.class);


// constructor injection

controller=new Controller(testDB);


// setter injection

controller=new Controller();

controller.setDatabaseModel(testDB);

注意:即使您verify(testDB).getActivites()从 setup 方法中删除,除非您实际将模拟对象提供DatabaseModel给controller.


查看完整回答
反对 回复 2022-07-20
?
LEATH

TA贡献1936条经验 获得超7个赞

您正在第二版verify中的方法中执行...setup


@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(); // REMOVE THIS LINE


}

此时不会调用任何内容,因此会出现错误。


您可能想将此行移到您的测试方法中,例如...


@Test

public void testServerCon(){


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

    testServer.add("Bar");

    assertEquals(testServer, controller.getAllActivites());

    verify(testDB).getActivites();

}


查看完整回答
反对 回复 2022-07-20
  • 2 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号