带有 while 循环的方法的 JUnit

JUnit for a method with while loop

我在为带有 While 循环的方法编写 JUnit 测试时遇到了一些困难。我的方法如下所示:

private void deleteMethod(DeleteRequest dr){

    // below statement am calling some service which returns me a object after querying it from Database.
    SomeObject ob = db.getdata(dr);

    while(ob != null) {
        // this method deletes the Data from DB 
        db.deleteData(ob);
        // again calling the same service operation as we did before while loop. I have a situation where my service only returns single record at a time. It is avoidable that I need to do a dirty job.
        ob = db.getdata(dr);
    }

下面是我的 JUnit:

@Test
public void testDeleteMethod() throws Exception{
    DeleteRequest mockDR = new DeleteRequest();
    mockDR.setX(y);
    SomeObject mockOB = new SomeObject();
    mockOB.setZ(k);
    // making a mockcall to the method before I can assert anything
    mockClassObject.deleteMethod(mockDR); 
}

上面的 JUnit 方法一直在执行中,我知道它没有脱离 while 循环。我该如何解决这个问题。顺便提一下,我正在使用 Mockito 框架,但我不知道 Mockito 中是否有任何方法可以处理这种情况。

使用 Mockito,您必须模拟数据库连接并使用 @InjectMocks、构造函数注入或通过 setter 将其注入您的服务,然后再测试您的方法。这就是我编写测试的方式。

@Test
public void testDeleteMethod() throws Exception{
    DeleteRequest deleteRequest = new DeleteRequest();
    deleteRequest.setX(y);
    SomeObject someObject = new SomeObject();
    someObject.setZ(k);

    Database db = Mockito.mock(Database.class);
    // Notice chain of calls
    Mockito.when(db.getdata(deleteRequest))
        .thenReturn(someObject).thenReturn(null);

    // TODO Inject the Database object into your mockClassObject.

    // making a mock call to the method before I can assert anything
    mockClassObject.deleteMethod(deleteRequest);

    Mockito.verify(db, Mockito.times(2)).getdata(deleteRequest);
    Mockito.verify(db).deleteData(someObject);
}

你可以看到我在 db.getData() 方法上链接了两次调用,第一次 returns someObject 和第二次 returns null.