Java 如何绕过单元测试play framework和mockito库的实际函数调用?

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

我正在为模型类编写单元测试,并使用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 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?(这是一个包含不在方法中的代码的类)