2013-04-24 104 views
2

我的代码中有一个测试,它创建一个目录,然后在其中创建一个文件。单元测试由于surefire插件forkmode而失败

但是,此测试失败,因为写入文件的测试部分无法找到所创建的目录。修复它的唯一的事情就是设置万无一失插件不会分支,像这样:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
     <forkMode>never</forkMode> 
    </configuration> 
</plugin> 

我会解释此修复程序意味着目录在一个JVM过程中产生的,而在另一个JVM进程创建的文件/线程?

此测试失败与最近刚开始失败的单台机器隔离。

,我已经尝试了几件事情是:

  1. 有众多的JDK版本流传在系统上,因此摆脱了所有的不同之处在于工作在许多其他系统的一个(1.6 .0_19)。
  2. 尝试从Administrator cmd提示符运行该项目上的'mvn test'。
  3. 检查父目录的权限是否正确。
  4. 尝试从零开始检查整个项目并执行相同操作。
  5. 检查发生此事的目录是否从AntiVirus的按访问扫描程序中排除。

以上都没有任何效果。唯一有所作为的是<forkMode>配置。我无法弄清楚为什么那个测试突然停止工作,因为它周围绝对没有任何代码变化或者它正在测试的功能。

正在使用的maven-surefire-plugin的版本是2.12.4。如果'never'配置丢失,更新到最新(2.14.1)不会修复测试。

<forkMode>deprecated但是仅在版本2.14以后。

我真的很感兴趣的是潜在的问题可能是什么。我希望最终的结论不像硬盘或硬件问题那么简单。

+2

是在测试'setUp()'方法中还是在另一个测试用例中创建的目录?你为每个测试创建不同的目录还是在测试中共享?请记住,测试用例可能会重新排序或并行运行,并且 - 根据测试逻辑 - 可能导致目录的并发修改。 – Pyranja 2013-04-24 08:22:03

+1

奇怪!我不太清楚这是两个单独的测试来创建目录并写入文件,或者如果两个事件都发生在相同的测试方法中?测试执行顺序可以由测试运行器随机重新排序。 – 2013-04-24 08:24:36

+0

@Pyranja现货!该目录是在setUp()方法中创建的,并且有两个测试然后尝试在该目录中创建文件。但我也曾在评论过所有其他测试之后尝试过,但那次测试失败了。 – 2013-04-24 10:47:47

回答

0

tl; dr:固定!

另一种全新的机器是为用户打造的。它工作了一个小时左右,然后在那之后,你看,完全一样的问题。

普遍的共识是它必须是一个流氓Windows更新。所以我们尝试了一些东西,比如将机器恢复到之前的状态。手动卸载Windows更新等。没有任何工作。

然后机器的主人有一个顿悟。显然,他已经习惯了this注册表黑客,这是这个美妙的神秘错误的原因。我们解开了这个,并且认为mvn clean install工作正常!

我还是很好奇,但为什么它会影响一个java程序,所以这里是围绕它的后续问题:(完成与gihub回购来隔离有问题的代码)Why does this autorun-cmd registry hack affect a java/maven process?

感谢所有有用的评论。