Mockito:如何用嘲弄来测试我的Dao?

时间:2013-12-31 10:52:12

标签: java spring junit mocking dao

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

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接口和类编写测试用例。

帮助将不胜感激:)

1 个答案:

答案 0 :(得分:17)

你认为你在测试中误解了模拟的概念。

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

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

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