2015-09-04 114 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