BaseTest_junit4.java 4.34 KB
package com.bsth;

import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.core.util.StatusPrinter;
import org.apache.commons.lang3.StringUtils;
import org.dbunit.database.DatabaseConfig;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.DatabaseSequenceFilter;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.FilteredDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.ext.h2.H2DataTypeFactory;
import org.dbunit.operation.DatabaseOperation;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.rules.TestName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import javax.sql.DataSource;
import java.io.File;
import java.util.Map;

/**
 * junit4基础测试类。
 */
public abstract class BaseTest_junit4 {
    /** 日志记录器 */
    public static final Logger LOG = LoggerFactory.getLogger(BaseTest_junit4.class);

    @Rule
    public TestName name = new TestName();

    @BeforeClass
    public static void initLogConfig() throws Exception {
        File logFile = new File(BaseTest_junit4.class.getResource("/logback.xml").toURI());
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        JoranConfigurator configurator = new JoranConfigurator();
        configurator.setContext(lc);
        lc.reset();
        configurator.doConfigure(logFile);
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
    }

    /**
     * 获取DBUnit数据源。
     * @return
     */
    private IDataSet getDataSet() throws Exception {
        Map<String, String> dbFileMap = getDbunitTestDbFileClassPathMap();
        String methodName = name.getMethodName();
        String dbunitClassPath = dbFileMap.get(methodName);
        if (StringUtils.isEmpty(dbunitClassPath)) {
            LOG.info("dbunit测试xml为空,key={}", methodName);
        }
        Resource res = new ClassPathResource(dbunitClassPath);
        FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
        builder.setColumnSensing(true);
        return builder.build(res.getInputStream());
    }

    /**
     * 获取数据库连接。
     * @return
     */
    private IDatabaseConnection getConnection() throws Exception {
        DatabaseConnection conn = new DatabaseConnection(getDataSource().getConnection());
        DatabaseConfig config = conn.getConfig();
        config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new H2DataTypeFactory());
        return conn;
    }

    /**
     * 初始化数据。
     * @throws Exception
     */
    @Before
    public void initDbunitDataSet() throws Exception {
        LOG.info("junit setup:dbunit-载入测试数据!===>");
        IDatabaseConnection connection = getConnection();
        DatabaseOperation.CLEAN_INSERT.execute(connection, getDataSet());
        connection.close();
    }

    /**
     * 销毁测试数据。
     * @throws Exception
     */
    @After
    public void afterDbunitDataSet() throws Exception {
        LOG.info("===>junit teardown:dbunit-销毁测试数据!");
        IDatabaseConnection connection = getConnection();
        // 使用FilteredDataSet重新定义数据库,否则删除的时候会发生外健依赖错误
        // 因为默认删除是按照表名字母顺序删除的,如果外健关联的表先删除,则发生外健约束错误
        IDataSet fullDataSet = new FilteredDataSet(new DatabaseSequenceFilter(connection), connection.createDataSet());
        DatabaseOperation.DELETE_ALL.execute(connection, fullDataSet);
        connection.close();
    }

    @Autowired
    private DataSource dataSource;
    /**
     * 获取数据源。
     * @return
     */
    public DataSource getDataSource() {
        return dataSource;
    }

    /**
     * 获取Dbunit测试数据文件xml映射,key=测试方法名,value=dbunit测试文件classpath
     * key:子类testCase方法名
     * value:dbunit数据文件classpath(如:db/testdata/dbunit_testdata1.xml)
     * @return
     */
    public abstract Map<String, String> getDbunitTestDbFileClassPathMap();
}