2012-07-30 47 views
1

我正在測試一個函數,該函數在異常時使用不同的參數重試。以下是僞代碼。在junit中測試引發異常的方法

class Myclass { 
public void load(input) 
    try { 
    externalAPI.foo(input); 
} catch(SomeException e) { 
    //retry with different parameters 
    externalAPI.foo(input,input2); 
} 

如何使用junit通過嘲笑externalAPI來測試上面的代碼。

@Test 
public void testServiceFailover(){ 

    m_context.checking(new Expectations() {{ 
     allowing (mockObjExternalAPI).foo(with(any(String.class))); 
     will (throwException(InvalidCustomerException)); 
     allowing (mockObjExternalAPI).foo(with(any(String.class),with(any(String.class))); 
     will (returnValue(mockResult)); 
    }}); 
} 

但上面的測試失敗,說「試圖拋出SomeException異常從一個方法(從foo())拋出沒有例外」。但實際上,foo方法在其方法簽名中提到了SomeException。

我該如何寫函數foo的junit?

+0

什麼模擬框架您使用的? – walters 2012-09-21 09:39:05

回答

1

隨着Mockito,我會做這樣的: ...

private ExternalAPI mockExternalAPI; 
private MyClass myClass; 

@Before 
public void executeBeforeEachTestCase() 
{ 
    mockExternalAPI = Mockito.mock(ExternalAPI.class); 
    //Throw an exception when mockExternalAPI.foo(String) is called. 
    Mockito.doThrow(new SomeException()).when(mockExternalAPI).foo(Mockito.anyString()); 

    myClass = new MyClass(); 
    myClass.setExternalAPI(mockExternalAPI); 
} 

@After 
public void executeAfterEachTestCase() 
{ 
    mockExternalAPI = null; 
    myClass = null; 
} 

@Test 
public void testServiceFailover() 
{ 

    myClass.load("Some string); 

    //verify that mockExternalAPI.foo(String,String) was called. 
    Mockito.verify(mockExternalAPI).foo(Mockito.anyString(), Mockito.anyString()); 
} 
+0

如果你把測試方法中的sut和mock創造出來,它會看起來更乾淨:) – 2012-09-21 09:55:24

+0

謝謝阿德里安。請參閱上面的更新。 – walters 2012-09-21 10:05:06