亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

注釋和方法調用之間的 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 關注
  • 93 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號