在测试用例中是否必须对返回的对象进行严格的断言?

时间:2014-08-27 18:36:23

标签: java unit-testing junit

我写作比较新," 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="test@gmail.com";
        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="test@gmail.com";
        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/

引用说,

  

不要做出不必要的断言

     

请记住,单元测试是一种如何确定的设计规范   行为应该起作用,而不是一切观察列表   代码恰好。

     

不要试图断言所有内容只关注你正在测试的内容   否则你最终会有多个测试用例失败   单一的原因,无助于实现任何目标。

这是什么意思?

1 个答案:

答案 0 :(得分:0)

单元测试通常是指盒式测试。所以,你应该知道你的代码并测试它应该做什么。如果getUsersByEmail负责将数据加载到email / name / id字段中,那么您应断言。如果它将加载委托给不同的测试方法,那么您不需要再次重新测试。理想情况下 - 主代码中的任何逻辑更改(我的意思是不重构)都应该完全打破一个单元测试。

assertNotNull(usersByEmail)是不必要的断言,因为如果它为null,你将在下一行获得NPE。