2011-03-18 86 views
7

服務接口:服務層測試使用了EasyMock

public List<UserAccount> getUserAccounts(); 
public List<UserAccount> getUserAccounts(ResultsetOptions resultsetOptions, List<SortOption> sortOptions); 

服務實現:

public List<UserAccount> getUserAccounts() { 
    return getUserAccounts(null, null); 
} 
public List<UserAccount> getUserAccounts(ResultsetOptions resultsetOptions, List<SortOption> sortOptions) { 
    return getUserAccountDAO().getUserAccounts(resultsetOptions, sortOptions); 
} 

如何測試這個使用了EasyMock或任何其他可行的測試方法?示例代碼將不勝感激。對於容易的模擬傳遞對象作爲參數非常混亂。有人清楚地解釋什麼是測試服務層的最佳方法?測試服務接口將被視爲單元測試還是集成測試?

+1

星期五晚上問個問題不是一個好主意,因爲沒有人在週末看這個,週一他們會忙着提出新的問題。我敢肯定,一些測試大師肯定知道這個答案和解釋,並會幫助我。 – kneethan 2011-03-21 14:36:11

回答

4

在這裏,你走了,假設你使用JUnit 4註釋:

import static org.easymock.EasyMock.createStrictMock; 
import static org.easymock.EasyMock.expect; 
import static org.easymock.EasyMock.replay; 
import static org.easymock.EasyMock.verify; 

public class UserAccountServiceTest 

    private UserAccountServiceImpl service; 
    private UserAccountDAO mockDao; 

    /** 
    * setUp overrides the default, We will use it to instantiate our required 
    * objects so that we get a clean copy for each test. 
    */ 
    @Before 
    public void setUp() { 
      service = new UserAccountServiceImpl(); 
      mockDao = createStrictMock(UserAccountDAO.class); 
      service.setUserAccountDAO(mockDao); 
    } 

    /** 
    * This method will test the "rosy" scenario of passing a valid 
    * arguments and retrieveing the useraccounts. 
    */ 
    @Test 
    public void testGetUserAccounts() { 

      // fill in the values that you may want to return as results 
      List<UserAccount> results = new User(); 

      /* You may decide to pass the real objects for ResultsetOptions & SortOptions */ 
      expect(mockDao.getUserAccounts(null, null) 
       .andReturn(results); 

      replay(mockDao); 
      assertNotNull(service.getUserAccounts(null, null)); 
      verify(mockDao); 
    } 

} 

您也可能會發現this article有用的,特別是如果你在JUnit 4中使用JUnit 3

Refer this一個快速的幫助

希望有幫助。

+0

感謝您的迴應,所以無論何時我們遇到一些與單元測試無關的對象參數,我們都會在期望調用中將它們設爲null? – kneethan 2011-03-22 19:51:23

+0

爲這兩種方法編寫單元測試用例真的有意義嗎?對我來說,它只是委託給DAO層,我們還需要測試嗎? – kneethan 2011-03-22 19:52:27

+0

對於一個簡單的getter,它可能不會 - 但是 - 如果你有服務方法中的條件和if/else路徑,那麼它會。另一件事是單元測試的全部目的是單元測試一個單元(在這種情況下是服務)而不是服務和DAO(這就是所謂的集成測試)。至於傳遞null,我選擇了最簡單的測試。但是,如評論中所述,您也應該創建這些對象(ResultSetOptions,SortOptions)。如果他們還沒有準備好(即只有接口和沒有實現),那麼你可能不得不爲他們使用模擬實現。 – Nilesh 2011-03-23 02:47:19