【问题标题】:Mockito : How to test my Dao with mocking?Mockito:如何用 mocking 测试我的 Dao?
【发布时间】:2014-01-18 07:39:48
【问题描述】:

我是 junit 和 TDD 的新手。我打算用 Mockito 来测试我的 dao。

道接口:

package com.test.SpringApp.dao;

import java.util.List;

import com.test.SpringApp.bean.Account;
import com.test.SpringApp.bean.Person;

public interface TestDao {
    List<Account> getAccountDetails(int account_id);
    Person getPersonDetails(int person_id);
}

DaoImpl 类代码:

package com.test.SpringApp.dao;

import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.apache.log4j.Logger;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import com.test.SpringApp.bean.Account;
import com.test.SpringApp.bean.Person;

public class TestDaoImpl implements TestDao {
    private static final Logger logger = Logger.getLogger(TestDaoImpl.class);
    private JdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public List<Account> getAccountDetails(int account_id) {
        try {
            String query = "select * from account where account_id=?";
            SqlRowSet rowset = jdbcTemplate.queryForRowSet(query,account_id);
            Account account = null;
            List<Account> accountDetails = new ArrayList<Account>();
            while (rowset.next()) {
                account = new Account();
                account.setAccountId(rowset.getInt("accountid"));
                account.setAccountType(rowset.getString("accounttype"));
                accountDetails.add(account);
            }
            return accountDetails;
        } catch (Exception e) {
            // TODO: handle exception
            logger.info("Error :" + e.getMessage());
            return null;
        }
    }

    private Person getPersonDetails(int person_id) {
        try {
            String query = "select * from Person where person_id=?";
            SqlRowSet rowset = jdbcTemplate.queryForRowSet(query,person_id);
            Person person = null;
            while (rowset.next()) {
                person = new Person();
                person.setName(rowset.getString("name"));
                stage.setNumber(rowset.getInt("number"));
            }
            return person;
        } catch (Exception e) {
            // TODO: handle exception
            logger.info("Error :" + e.getMessage());
            return null;
        }
    }
}

我正在使用上述接口和类从数据库中获取帐户和个人详细信息。有人可以解释一下如何使用 junit 和 Mockito 为上述 dao 接口和类编写测试用例。

我们将不胜感激:)

【问题讨论】:

  • 为了有意义地测试你的 DAO,你需要一个数据库。最好为此使用一个小的内存数据库,否则您的测试将花费太长时间来运行并且设置起来太尴尬。我过去成功地使用了H2。祝你好运。

标签: java spring junit mocking dao


【解决方案1】:

您似乎误解了在测试中模拟的概念。

假设您有一个类A 和一个类BA 类有一个方法 mA(),它使用 B 类中的方法 mB() 来实现其功能。

如果您现在想测试mA(),那么mA() 将调用mB()。在大多数情况下,这不是问题,但假设类 B 是一个 DAO,mB() 是一些将查询数据库的函数。然后你需要一个数据库来测试mA()。现在假设您已经测试了mB(),而您只想测试mA()。所以你可以用一个模拟替换B,它“模拟”mB()

在您的情况下,BTestDao/TestDaoImpl。所以如果你想模拟TestDao,那么你需要其他东西(A)来测试,因为你无法测试模拟的类

【讨论】:

  • 非常感谢您的精彩解释 :)
  • 如何在测试方法中模拟B?当mA 将调用时,它将使用B 的对象调用mBmA中的对象B怎么会被mock?
  • @eatSleepCode:假设A 有一个字段private B b; 保存B 的实例。 A 有一个字段 b 的设置器。
猜你喜欢
  • 1970-01-01
  • 2018-11-14
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
相关资源
最近更新 更多