我对在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();
}
@Test
public void testServerCon(){
ArrayList<String> testServer=new ArrayList<>();
testServer.add("Bar");
assertEquals(testServer, controller.getAllActivites());
}
}
当我在第二个方法中使用verify方法时,出现一个错误,该方法从未在模拟中调用,所以我想知道我缺少什么吗? 我在网上查找了教程,其中一些使用批注,一些使用方法调用,但是如果我没记错的话,它们应该是相同的,那么我在这里错过了什么?
答案 0 :(得分:1)
在您的第一个示例中,@InjectMocks
注释使Controller
的实例与模拟的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()
,测试也将失败,除非您实际上将模拟的DatabaseModel
提供给controller
。
答案 1 :(得分:0)
您正在使用第二个版本的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();
}