2014-08-27 56 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