文档章节

如何解决DbUnit的Maven插件在执行过程中出现的侵犯外键约束错误(MySQLIntegrityConstraintViolationException)

猪刚烈
 猪刚烈
发布于 2014/10/12 11:40
字数 706
阅读 46
收藏 0

精选30+云产品,助力企业轻松上云!>>>

如果是在使用UbUnit进行单元测试时遇到


其实这个问题不止在通过DbUnit的Maven插件操作数据库时会遇到,在基于DbUni进行单元测试时也会遇到,一般的处理方法是在每次获取连接时前执行一个"set  @@session.foreign_key_checks = 0"的statement,以保证本次会话不作外键约束检查,以下是我常用的一个基于DbUnit的单元测试基类,其中第59行就是关于禁止外键约束检查的设置。(注:本例使用的数据库是MySql)

package oobbs.domainmodel;

import java.sql.SQLException;

import javax.sql.DataSource;

import org.dbunit.DataSourceDatabaseTester;
import org.dbunit.DefaultOperationListener;
import org.dbunit.database.DatabaseConfig;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.xml.XmlDataSet;
import org.dbunit.ext.mysql.MySqlDataTypeFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import testutil.ApplicationContextSupport;

/**
 * This base class does not extends any DBTestCase of dbunit,or use any Tester,Their's implement is not good and flexible.
 * Here,we prepare and set connection manully!
 * 
 * @author Laurence Geng
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/applicationContext-infrastructure.xml",
								   "classpath:/applicationContext-domainModel.xml",
								   "classpath:/applicationContext-test.xml"})
public abstract class DbBasedTest{
	
    /** The data source. */
    @Autowired
    protected DataSource dataSource;

    /** The dbunitTestUtil can fill test data from xml into test db before testing. */
    protected DataSourceDatabaseTester dbunitTestUtil;
    
    /**
     * Inits dbunitTestUtil. 
	 * The connectionRetrieved method is called back when setUp() executes.
	 * At this time,we should set connection-specific setting: set foreign key check disabled
	 * so as dbunit can invert test data, and set data type factory be MySqlDataTypeFactory so as
	 * dbunit can convert correct type when invert data to mysql.
	 *
     * @throws Exception the exception
     */
    protected void initDbunitTestUtil() throws Exception{
    	dbunitTestUtil = new DataSourceDatabaseTester(dataSource);
		dbunitTestUtil.setDataSet(new XmlDataSet(new ClassPathResource("dbunit-test-data.xml").getInputStream()));
		dbunitTestUtil.setOperationListener( new DefaultOperationListener(){
            public void connectionRetrieved(IDatabaseConnection connection) {
                try {
                	//Disable foreign key check!
					connection.getConnection().prepareStatement("set @@session.foreign_key_checks = 0").execute();
					// When a new connection has been created then invoke the setUp method
					// so that user defined DatabaseConfig parameters can be set.
					connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
				} catch (SQLException e) {
					e.printStackTrace();
				}
            }});
    }
	
	/**
	 * Before test method.
	 * 
	 * @throws Exception the exception
	 */
	@Before
    public void beforeTestMethod() throws Exception { 
		initDbunitTestUtil();
		dbunitTestUtil.onSetup();
    }
    
    /**
     * After test method.
     * 
     * @throws Exception the exception
     */
    @After
    public void afterTestMethod() throws Exception {
    	dbunitTestUtil.onTearDown();
    }
    
}


如果是在使用DbUnit的Maven插件时遇到


而如果是使用Maven的DbUnit插件,以命令行的方式执行数据导入工作的话,就只能从数据库连接的url上下手了,方法也很简单就是在原插件的配置上添加foreign_key_checks = 0这个变量,以下是一个例子,请注意第14行<url>标记的部分:<url>${jdbc.url}&amp;sessionVariables=foreign_key_checks=0</url>,它在标准url后面追加了对变量foreign_key_checks的设置。

<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>dbunit-maven-plugin</artifactId>
				<version>1.0-beta-3</version>
				<dependencies>
					<dependency>
						<groupId>${jdbc.groupId}</groupId>
						<artifactId>${jdbc.artifactId}</artifactId>
						<version>${jdbc.version}</version>
					</dependency>
				</dependencies>
				<configuration>
					<driver>${jdbc.driverClassName}</driver>
					<url>${jdbc.url}&sessionVariables=foreign_key_checks=0</url>
					<username>${jdbc.username}</username>
					<password>${jdbc.password}</password>
				</configuration>
				<executions>
					<execution>
						<id>default-cli</id>
						<goals>
							<goal>operation</goal>
						</goals>
						<configuration>
							<type>CLEAN_INSERT</type>
							<src>src/test/resources/dbunit-test-data.xml</src>
							<dataTypeFactoryName>org.dbunit.ext.mysql.MySqlDataTypeFactory</dataTypeFactoryName>
							<transaction>true</transaction>
						</configuration>
					</execution>
				</executions>
			</plugin>


备注

mysql中,变量的作用域有两种session和global,改变变量值的方法为:


要想设置一个GLOBAL变量的值,使用下面的语法:


mysql> SET GLOBAL sort_buffer_size=value;
mysql> SET @@global.sort_buffer_size=value;


要想设置一个SESSION变量的值,使用下面的语法:


mysql> SET SESSION sort_buffer_size=value;
mysql> SET @@session.sort_buffer_size=value;
mysql> SET sort_buffer_size=value;

猪刚烈

猪刚烈

粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
私信 提问
加载中
请先登录后再评论。
Maven环境下测试库和开发库的配置策略以及支持工具

在项目的开发和测试上,团队往往有这样一些情况和要求:   1. 只要是走单元测试,必然要清库   2. 开发人员不想每次重新构建都从一个空库开始重新输入数据,他们希望能够使用一个已有的库...

猪刚烈
2014/10/12
28
0
java SSM框架单元测试最佳实战代码

具体的代码参考链接:https://pan.baidu.com/s/1e9UTyidi4OMBwYydhwH-0g 密码:rmvs 本教程采用的是对单元测试的dao层、service层、control层进行单元测试 其中采用的测试框架可以是junit,也...

osc_3xdojbp9
2018/07/06
2
0
dbunit经典的NoSuchColumnException解决之道

抱怨 dbunit这么多人用,这个项目居然好像没有人在维护了,自动2012年9月release一个版本后,再没有更新了,寒心啊。 dbunit有一个大大的BUG,即会解释不了MySQL表的结构,在使用@DataSet准备...

stamen
2015/08/21
567
0
使用DBUnit集成Spring简化测试

在上一篇博文使用DBUnit做单元测试中,谈到了使用DBUnit进行数据准备做单测试,可以方便我们的数据准备以及后面的执行结果的验证,简化了我们做单元测试的准备工作,不过其中有一个不足就是,...

osc_z7d2bxvl
2019/01/31
4
0
数据库测试工具,谁更锋利?

本文从DBUnit开始介绍一系列测试工具,无论是旧轮子,还是新轮子... Utilities-DBUnit、Spring-test-dbunit 都不放过,但最后亮出新利器...... 1-DBUNIT 数据库测试工具事实上的标准就是DBU...

osc_nhwfplmt
2019/10/07
2
0

没有更多内容

加载失败,请刷新页面

加载更多

Cocoa Autolayout:内容拥抱与内容压缩阻力优先

问题: I can't find a clear answer on Apple documentation regarding Cocoa Autolayout about the difference between content hugging and compression resistance. 关于Cocoa Autolayou......

javail
39分钟前
12
0
OSChina 周二乱弹 —— 附近居民接连失踪,你们有什么头绪吗

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《伤离别(原版)》- 黄霑 手机党少年们想听歌,请使劲儿戳(这里) @巴拉迪维 :睡...

小小编辑
49分钟前
17
0
IntelliJ IDEA 默认快捷键大全

Remember these Shortcuts 常用 功能 快捷键 备注 ● Smart code completion Ctrl + Shift + Space - ● Search everywhere Double Shift - ● Show intention actions and quick-fixes Alt......

巨輪
今天
24
0
Hacker News 简讯 2020-07-14

更新时间: 2020-07-14 02:01 Chipmaker Analog Devices to Acquire Maxim Integrated for $21B - (reuters.com) 芯片制造商模拟设备公司将以210亿美元收购Maxim Integrated 得分:92 | 评论:......

FalconChen
今天
129
0
绕过移动端系统限制的 dlopen 库 byOpen

byOpen是一个绕过移动端系统限制的增强版dlfunctions库。 支持特性 Android 支持App中加载和使用Android系统库接口(即使maps中还没有被加载也支持)。 Android 7以上dlopen, System.load都是...

shzwork
昨天
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部