2012-09-19 116 views
10

我是單元測試的新手。我使用TestNG和MyEclipse爲我的應用程序開發單元測試用例。在做這件事時,我遇到了EasyMock的一些問題。這裏是我的代碼(類的名稱,方法名稱和返回類型由於安全原因而改變,但您會清楚地知道我在這裏實現的目標)。使用EasyMock測試異常的方法

public MyClass 
    { 
     // This is a method in my class which calls a collaborator which I 
     // want to mock in my test case 
     public SomeObject findSomething(SomeOtherObject param) throws Exception 
     { 
      SomeOtherObject param a = myCollaborator.doSomething(param); 
      // Do something with the object and then return it 
      return a; 
     } 
    } 

現在這裏是我的測試。現在我真的想在我的測試 的情況下實現的是,我想檢查我的函數(findSomething)正確 在拋出異常時拋出異常。在將來一些 其他開發人員可以更改該方法的簽名(拋出異常不是 方法簽名的一部分),並從我的方法中刪除拋出異常。那麼我怎樣才能確保沒有人更改 呢?

@Test(dataProvider="mydataProvider", expectedExceptions=Exception.class) 
public void MyTest(SomeOtherObject param) throws Exception { 
{ 
    EasyMock.expect(myCollaboratorMock.doSomething(param)).andThrow(new Exception()); 
    EasyMock.replay(myCollaboratorMock); 
} 

我得到異常

「java.lang.IllegalArgumentException異常:最後 方法叫上模擬不能扔java.lang.Exception的」

我什麼 做錯了這裏?有人可以在我的特定情況下闡述如何撰寫測試 的案例嗎?

回答

18

合作者的doSomething()方法沒有聲明它可能會拋出異常,並且你告訴它的模擬拋出一個異常。這是不可能的。

異常是一個檢查異常。只有在方法簽名中聲明它才能被拋出。如果該方法沒有throws子句,則它只能拋出運行時異常(即RuntimeException或任何後代類)。

+0

錯誤。通過使用[generic quirks](http://java.dzone.com/articles/throwing-undeclared-checked),可以從幾乎所有地方拋出檢查的異常。 – jontejj