2010-11-26 82 views
2

時何時以及爲什麼要使用Mocking,我對測試ejbs時使用模擬對象的時間和原因感到困惑。在測試EJB時測試EJB

我使用普通的JUnit,我發現它的作品找到我,但我知道它不是所有的故事。

例子:

@Stateless(name = "MyService") 
public class MyBean extends BaseBean implements MyService 
{ 
    public MyBean() 
    { 
    } 

    public List<Category> getAllMainCategories() 
    { 
     //Category.findAll is a named query defined in Category entity 
     return (List<Category>) em.createNamedQuery("Category.findAll").getResultList(); 
    } 
} 

而這裏的測試類:

public class MyServiceTest 
{ 

    MyService service; 

    @Before 
    public void setUp() throws Exception 
    { 
     Context context = new InitialContext(); 
     service = (MyService) context.lookup("MyService"); 
    } 

    @Test 
    public void getAllMainCategories() throws Exception 
    { 
     assertNotNull(service); 
     assertTrue(service.getAllMainCategories().size() > 0); 
    } 

} 

正如你看到的,我做了會話bean的單元測試,而不需要模擬對象......所以是這完全是真的,還是我缺乏一些東西?

回答

1

當你想測試一些獨立存在依賴的東西時,你可以模擬它。例如,如果服務使用DAO,則當您單元測試服務時,可以模擬DAO,以確保由於服務代碼而發生任何測試失敗,而不是DAO代碼。換一種說法,如果您不嘲笑DAO,並且服務測試失敗,則需要了解由於DAO調用失敗或由於服務代碼而導致測試失敗。

另外,使用mock簡化了測試,因爲您有一個恆定數量的測試設置。隨着依賴關係數量的增長,滿足依賴關係所需的所有需求可能是一種真正的痛苦。與使用mock相反,您需要滿足的唯一依賴是在您的模擬框架中設置期望值。

0

您可能會喜歡here(Martin Fowler博客)的Mocks相關信息。

當您想測試具有副作用依賴性的代碼時使用模擬。打電話給一些服務庫,像另一個海報建議的DAO,是一種典型的用途。但是,使用模擬從不是強制性的。在DAO情況下,另一種方法是向您的測試類提供一些DAO包裝對象。在測試用例中,您將提供另一種生成控制結果的DAO包裝器對象。這種避免mock的方法被稱爲「依賴注入」,它給出了與mocks相同的好處(實際上它與使用mock庫相同,但是「手工」)。但是在某些情況下,使用依賴注入而不是Mocks庫會有點尷尬(你必須定義一些你可以派生的包裝對象,而不是使用標準包)。

Personaly我不太喜歡Mocks,儘量避免使用它們。我不喜歡它們的原因是因爲當外部API行爲發生變化時它們很容易導致測試不會失敗,是的,這是真正的單元測試,但對我的口味來說太過堅固。另一點是因爲使用嘲諷我們傾向於測試我認爲應該是黑匣子的內部行爲,但嘲笑也有很大的粉絲。