簡體   English   中英

在單元測試中是否有替代模擬對象的方法?

[英]Is there an alternative to mock objects in unit testing?

它是一個Java(使用JUnit)企業Web應用程序,沒有預先構建的模擬對象,並且需要花費大量時間來估計它們。 是否有測試范例可以給我“一些”測試覆蓋率,但不是總覆蓋范圍?

您是否嘗試過像EasyMock這樣的動態模擬框架? 它不需要你“創建”Mock對象,因為你必須編寫整個類 - 你在測試本身中指定你想要的行為。

使用UserService查找有關用戶的詳細信息以便將某人記錄在其中的類的示例:

//Tests what happens when a username is found in the backend
public void testLoginSuccessful() {
    UserService mockUserService = EasyMock.createMock(UserService.class);

    EasyMock.expect(mockUserService.getUser("aUsername")).andReturn(new User(...));
    EasyMock.replay(mockUserService);

    classUnderTest.setUserService(mockUserService);

    boolean isLoggedIn = classUnderTest.login("username");
    assertTrue(isLoggedIn);
}

//Tests what happens when the user does not exist
public void testLoginFailure() {
    UserService mockUserService = EasyMock.createMock(UserService.class);

    EasyMock.expect(mockUserService.getUser("aUsername")).andThrow(new UserNotFoundException());
    EasyMock.replay(mockUserService);

    classUnderTest.setUserService(mockUserService);

    boolean isLoggedIn = classUnderTest.login("username");
    assertFalse(isLoggedIn);
}

(1)單元測試(和模擬)的替代方案包括集成測試(使用dbUnit )和FIT測試。 有關更多信息, 請參閱此處的答案

(2)模擬框架Mockito非常出色。 你不必“預先建立”任何模擬。 引入項目相對容易。

我會回應其他人對EasyMock的看法。 但是,如果你有一個代碼庫,你需要模擬靜態方法調用,最終類或方法等等,那么給JMockit看看。

好吧,如果不是最簡單的方法,獲得高水平的代碼覆蓋率就是在測試驅動開發(TDD)之后編寫代碼測試優先。 現在代碼存在,沒有單元測試,它可以被視為遺留代碼。

你可以編寫端到端測試,在你的應用程序外部,那些不是單元測試,但它們可以編寫而不需要任何類型的模擬。 或者你可以編寫跨越多個類的單元測試,並且只模擬阻礙單元測試的類。

您是否擁有可導入測試平台的真實世界數據,以用作快速的“模擬對象”

我認為相反的情況很難 - 找到一種測試方法,可以在大多數情況下盡可能地提供全面覆蓋。

你應該試試EasyMock

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM