2015-09-04 113 views
3

我在编写具有While循环的方法的JUnit测试时面临一些困难。我的方法看起来象下面这样:具有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中的这种情况。

+0

当'ob'等于'null'时,循环终止。如果有的话,是否会发生? –

+0

db在哪里定义和嘲笑?你有什么尝试。请不要命名不是mock的'mockXxx'对象。这里应该嘲笑的唯一的东西是'db'。 –

回答

3

使用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()方法两次,第一次返回someObject和第二次返回null