TekNote #1: 在Mac(Snow Leopard)下,用Maven运行测试(mvn test)时,DBUnit 读文件的编码问题(file.encoding)

2010-11-02

 

我遇到的问题是这样一个项目:

 

一个Maven2 项目,其中用到数据库。数据类用JPA来定义。测试时,测试数据通过DBUnit来进行装载。

 

开发环境信息 -

OS:Mac OS 10.6.4

JVM:

java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-10M3261)
Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03-307, mixed mode)

 

另外一些信息,不都与遇到的问题相关,但是罗列一下:项目主要代码是Scala 2.8,用了scalajpa,测试框架用了ScalaTest和TestNG。DBUnit载入数据,是用CsvDataSet,所以真正的数据,是在一个目录下的多个.csv文件中(每个.csv文件对应一个table,另外有个table-ordering.txt文件来定义各个table的数据加载的顺序)。每个.csv文件,如果很有中文内容,是utf-8格式的。

 

问题 是:当用Eclipse的TestNG插件运行单独的TestSuite时,所有的测试全部通过;但是在用m2eclipse或者终端的命令行运行“mvn test”,有些测试用例不通过,并且在输出的surefire日志文件(target/surefire-reports/TestSuite-output.txt)中,很多中文部分是乱码。

 

分析

虽然这很显然是编码问题,但是到底编码错误出在哪个环节,又应该如何解决,还是颇费了我一番周折。我把网上能找到的跟使maven使用UTF-8作为默认file.encoding相关的方式都尝试了,但是这些都没用

  1. 设MAVEN_OPTS="-Dfile.encoding=UTF-8"环境变量
  2. 设JAVA_OPTS="-Dfile.encoding=UTF-8"环境变量
  3. 在pom.xml里加“UTF-8...
  4. 在maven-compiler-plugin的配置中加上"UTF-8..."

后来我发现,如果在运行maven时,加上”-DforkMode=never"的参数(不管是用m2eclipse还是终端),有些上述手段就能解决问题。原来,maven在运行surefire时,会启动另外的JVM来运行这些测试用例,而新启动的JVM使用操作系统默认的file.encoding。而对Mac 10.6 (Snow Leopard)自带的JVM来说,这默认的file.encoding是“MacRoman” (WTF?!)。之所以在Eclipse里面运行没有问题,是因为我在Eclipse的项目参数里已经把Encoding设为了UTF-8:Preferences -> General -> Workspace -> Text File Encoding

 

前面那几种办法,包括eclipse里面项目的text file encoding的设置,都只针对于maven所在运行的,或者是eclipse所运行的JVM,而不作用于被surefire插件启动的JVM,因此在surefire不“fork"新JVM的情况下,才能起作用。

 

解决 办法:

 

最终找到的解决办法其实很简单:在pom.xml的surefire插件的定义中,加入参数,使maven在启动新的jvm时,使用UTF-8作为默认的file.encoding。也就是在“maven-surefire-plugin”的“configuration”元素中,加入一行:

 

          -Dfile.encoding=UTF-8

样例:pom.xml 文件相关的部分如下:

... maven-surefire-plugin -Dfile.encoding=UTF-8 true

 

你可能感兴趣的:(TekNote)