【问题标题】:unit testing on dao classdao类的单元测试
【发布时间】:2013-08-26 04:23:51
【问题描述】:

好的,我需要一些帮助。我的 DAO 类中有这个方法,我需要对其进行测试:

public boolean saveOrUpdateUser(User user) {
    boolean res = false;
    try {
        this.getHibernateTemplate().saveOrUpdate(user);
        res = true;
    } catch (DataAccessException e) {
        res = false;
        this.logger.error("DataAccessException", e);
    }
    return res;
}

以下是我的测试方法:

   public void saveAndUpdateUserTest() {
              User user =new User ();
              user.setUserid(12);
              user.setFirstname("John");
              user.setLastname("Smith");

              assertEquals(12,user.getUser_id());
              assertEquals("John",user.getFirstname());
              assertEquals("Smith",user.getLastname());

       }

我需要在 saveAndUPdateUserTest 中以某种方式调用此方法,但我不知道要传递哪个参数!有人可以帮忙吗?

public boolean saveOrUpdateUser(User user) {..}

用户用户是什么意思? 我有一个包含 set 和 get 方法的类 user.java。

提前致谢。我还是一个初学者,我需要建议和帮助如何继续。

【问题讨论】:

  • 如果您是初学者,不确定方法调用是如何工作的,那么您应该花一些时间学习语言的基础知识,然后再处理对象持久性之类的问题。
  • 您需要在您的测试类中创建一个存在saveOrUpdateUser 方法的DAO 类的实例,然后调用该方法,传递您在测试方法中创建的示例用户。

标签: java unit-testing dao


【解决方案1】:

不是真正的答案,但无论您编写什么测试,代码都是错误的。 Hibernate 抛出的异常是不可恢复的,因此你不应该捕获它们并假装什么都没发生。代码应该是

public void saveOrUpdateUser(User user) {
    this.getHibernateTemplate().saveOrUpdate(user);
}

或者,如果你真的想要日志:

public void saveOrUpdateUser(User user) {
    try {
        this.getHibernateTemplate().saveOrUpdate(user);
    } 
    catch (DataAccessException e) {
        this.logger.error("DataAccessException", e);
        throw e;
    }
}

另一个注意事项:HibernateTemplatedocumented,因为“你不应该再使用这个类了”。对于 Hibernate 4,它甚至不再存在。

我同意评论。如果您不了解对象和方法参数,请先学习 Java 的基础知识。 Spring 和 Hibernate 比基础知识高出许多层次,如果您不了解基本的 Java/编程概念,就会碰壁。

【讨论】:

    【解决方案2】:
     public void saveAndUpdateUserTest() {
    
                  //here is your variable of type User
                  User user =new User ();
                  user.setUserid(12);
                  user.setFirstname("John");
                  user.setLastname("Smith");
    
                  assertEquals(12,user.getUser_id());
                  assertEquals("John",user.getFirstname());
                  assertEquals("Smith",user.getLastname());
    
                  //you need to pass a variable with type User
                  saveOrUpdateUser(user);
    
           }
    

    this 将是一个很好的起点。

    【讨论】:

    • saveOrUpdateUser(user) 这个变量我不理解。我需要通过什么?我有一个 UserDao 接口,然后是一个实现该接口的类 UserDaoImpl。(这个类包含 saveAndUpdateUser(User user) 。
    • @user2703420:阅读本教程:docs.oracle.com/javase/tutorial/java/javaOO/index.html
    • 当我插入这一行时://你需要传递一个类型为 User saveOrUpdateUser(user); 的变量它告诉我这个方法是未定义的。变量“用户”正在获取所有 3 个值,即 id、名字和姓氏?我是对还是错?
    • 如果你的 DAO 类中有 saveOrUpdateUser 方法,那么你应该实例化你的 DAO 类,然后在它上面调用 saveOrUpdateUser。
    • 谢谢。我有另一个方法调用: public User retrieveUserById(int id) {...} 我如何在我的测试方法中调用这个方法?我已经实例化了这个类。此方法属于用户类型。我该如何进行?我被困在这里..
    【解决方案3】:

    您永远不应该像在代码中那样捕获异常。回到您的问题,请记住称为 AAA 的主要 TDD 模式 - 安排、行动、断言。

    Arrange 是您初始化 SUT(被测系统)的地方 行动是否有行动发生(调用测试系统) 断言在那里你检查结果。

    public void anyKindOfTest() {
       // arrange
    
       // act
    
       // assert
    }
    

    在你的情况下,

    public void shouldStoreUser () {
      // arrange
      User user = new User ("John", "Smith");
      UserStorage userStorage = new UserStorage();
    
      // act
      userStorage.store(user);
    
      // assert
      assertNotNull(user.id);  
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 2013-07-09
      • 2012-12-22
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 2011-07-21
      相关资源
      最近更新 更多