2014-08-27 53 views
-1

我在寫「GOOD」單元測試用例方面比較新。在測試用例中返回的對象是否嚴格斷言?

我的POJO類是:

public class User { 

    private String userId; 

    private String email; 

    private String name; 

    public String getUserId() { 
     return userId; 
    } 

    public void setUserId(String userId) { 
     this.userId = userId; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

我的界面:

public interface UserDao { 

    List<User> getUsersByEmail(String email); 
} 

我的測試用例是;

public class UserDaoTest { 

    private UserDao userDao; 
    @Test 
    public final void testUsersGetByEmailFunctional() 
    { 
     final String email="[email protected]"; 
     List<User> usersByEmail = userDao.getUsersByEmail(email); 
     Assert.assertNotNull(usersByEmail); 
     for(User user : usersByEmail) 
     { 
      Assert.assertEquals(user.getEmail(), email); 
     } 
    } 

    /** 
    * NOTE : Consider that User.equals() method is not available due to other constraints 
    */ 
    @Test 
    public final void testUsersGetByEmailStrict() 
    { 
     final String email="[email protected]"; 
     final String expectedName="xxx"; 
     final String expectedUserId="123"; 
     List<User> usersByEmail = userDao.getUsersByEmail(email); 
     Assert.assertNotNull(usersByEmail); 
     for(User user : usersByEmail) 
     { 
      Assert.assertEquals(user.getEmail(), email); 
      Assert.assertEquals(user.getName(), expectedName); 
      Assert.assertEquals(user.getUserId(), expectedUserId); 
     } 
    } 
} 

現在我的問題是,哪個測試用例最合適?

http://howtodoinjava.com/2012/11/05/unit-testing-best-practices-junit-reference-guide/

該帖稱,

不要進行不必要的斷言

記住,單元測試有一定的 行爲應該如何工作的設計規格,不代碼碰巧發生的所有事情的觀察列表。

不要試圖斷言一切都只是專注於你正在測試 否則你會最終有一個 單一的原因,不實現任何幫助多個測試用例失敗。

這是什麼意思?

回答

0

單元測試通常意味着即時測試。所以,你應該知道你的代碼並測試它應該做什麼。如果getUsersByEmail負責將數據加載到電子郵件/名稱/ ID字段中,則應該聲明。如果它將加載委託給不同的測試方法,則不需要再次重新測試。理想情況下 - 主代碼中的任何邏輯改變(我的意思不是重構)都應該打破一個單元測試。

assertNotNull(usersByEmail)是不必要的斷言,因爲如果它爲空,您將在下一行中獲得NPE。

+0

感謝您的回覆。既然你提到assertNotNull(usersByEmail)是不必要的,我有一個問題。測試用例本身可以拋出異常。理想情況下,如果測試用例失敗,我認爲它應該是因爲斷言而不是測試用例本身。糾正我,如果我錯了。 – 2014-08-28 05:54:33

+0

@TariqSulaiman通常一個測試方法簽名是'@Test public void testSomething()throws Exception'。測試過程中引發的任何異常都會使其變爲紅色。 – kan 2014-08-28 07:14:42

+0

感謝您的回覆。 @kan – 2014-08-28 08:49:17