Java 如何绕过单元测试play framework和mockito库的实际函数调用?
我正在为模型类编写单元测试,并使用MongoDB和playframe工作。我想跳过对数据存储的实际调用,并测试其余的功能Java 如何绕过单元测试play framework和mockito库的实际函数调用?,java,unit-testing,mockito,playframework-2.4,Java,Unit Testing,Mockito,Playframework 2.4,我正在为模型类编写单元测试,并使用MongoDB和playframe工作。我想跳过对数据存储的实际调用,并测试其余的功能 //Transfer Object Class. Class public MyModel { //Attributes for model. private int id; private String name; private String phone; } //Access Object Class. Class public My
//Transfer Object Class.
Class public MyModel {
//Attributes for model.
private int id;
private String name;
private String phone;
}
//Access Object Class.
Class public MyModelAccess {
// getDs is a mongo library function which returns datastore instance.
private DatastoreImpl datastore = getDs();
public static boolean insert(MyModel data) {
try {
datastore.save(data);
return true;
} catch(Exception e) {
printException(e.ErrorMessage());
}
return false;
}
}
//Testing class.
public class TestMyModelAccess {
MongoClient mongoTest = mock(MongoClient.class);
Morphia morphiaTest = new Morphia();
DatastoreImpl datastore = spy(new DatastoreImpl(morphiaTest, mongoClientTest, "TestDB"));
doReturn(null).when(datastore).save(any(MyModelAccess.class));
MyModelAccess obj = new MyModelAccess();
// Add some dummy data to object.
boolean response = MyModelAccess.insert(obj);
assertEquals(response, true);
verify(datastore).save(isA(MyModel.class));
}
我这样写是通过reffering,但是它在实际的mongo和verify测试中创建一个条目失败了,因为DatastoreImpl.save(isA(MyModel))没有被调用
我只想跳过对datastore.save的实际调用,只想检查它是否是用给定类型的参数调用的。正如其他人所问,您需要在这个问题中输入getDs()方法的详细信息。我假设您对使用PowerMock或其他软件不感兴趣,而只对Mockito感兴趣。在测试类中,您需要创建被测试类的子类,并重写此方法以返回模拟的
DatastoreImpl
。要使方法可用于重写,它至少需要具有包级别的可访问性。然后,测试这个超级类,而不是实际的类。下面的代码示例(假设getDs()可以在子类中重写)-我只是粘贴增量代码,其余部分保持原样
class MyModelAccessTestable extends MyModelAccess {
private DatastoreImpl datastore;
void setDataStore(DatastoreImpl datastore){
this.datastore=datastore;
}
@Override
DatastoreImpl getDs(){
return datastore;
}
}
public class TestMyModelAccess{
@InjectMocks MyModelAccessTestable testService;
@Mock private DatastoreImpl datastore;
@Before
public void setUp(){
testService.setDataStore(datastore);
}
@Test
public void test(){
MyModel obj=new MyModel();
testService.insert(obj);
}
}
我还假设您的代码有一个输入错误,
mymodelaccesobj=newmymodelaccess()代码>我猜是-MyModel obj=newmymodel()代码>getDs()如果要绕过该行为,代码>是需要模拟的实际方法。然后,您将为模拟的DatastoreImpl
指定所需的行为,并验证与它的交互。如果由于某种原因不可能这样做,那么可以使用来模拟DatastoreImpl
的实例化,因为您没有发布非常重要的代码。并且你发布的代码没有编译。DataStoreImpl是如何传递到MyModelAccess的?您使用的是一个名为datastore
的实例字段,它来自一个名为insert
的静态方法,无法工作。通过调用getDs()
检索datastore
,但是getDs()
如何获取在testmodelacess
中创建的DataStoreImpl?(这是一个包含不在方法中的代码的类)