2016-10-03 140 views
1

我有一个项目有3个测试类 - TextModelTest,LocalClassificationTaskTest,ModelFetcherTest。 单独运行时,它们中的每一个都会通过,但是一次运行(来自Eclipse)时,第三个(ModelFetcherTest)的所有测试都会失败,并显示NullPointerException。令人惊讶的是,日食甚至不会停留在我放入测试类的断点处(ModelFetcher)。JMockit @Mocked annotation导致其他测试失败

做一些研究(试图忽略每一个成功的测试,以找出哪一个导致第三类失败)后,我注意到,在第二个测试类(LocalClassificationTaskTest)具有ModelFetcher类型的嘲笑场,这是第三测试类的CUT:

@Mocked ModelFetcher modelFetcher; 

ModelFetcherTest

@Tested ModelFetcher modelFetcher; 

我除去@Mocked注释并用代替它的逻辑0(这是更麻烦和冗长,但无论如何),现在一切正常。

请注意,问题仅在eclipse中发生。所有测试通过maven运行时传递。 没有种族问题,所有的测试通过和失败一致(不涉及运气)。

@Mocked注解是否会影响同一个项目中的其他测试用例?

+0

您应该显示[这三个测试类的最小版本,当它以“正确”顺序执行时会重现失败](http://stackoverflow.com/help/mcve)。否则,没有办法提供实际的答案。 –

回答

0

@Mocked注释在一个类中可能会影响另一个类的唯一方法是如果jvm过程在类之间共享。通常情况下,每个测试类应该分离一个独立的jvm进程,从而将模拟分离到各自的测试类。这听起来像你的测试套件一起运行所有的测试运行一个jvm。我不使用Eclipse,但this thread似乎表明这对于Eclipse中的其他人来说是个问题。不过,您也许可以在Eclipse中更改构建脚本以分离独立的jvm。

+0

10倍,我检查了线程,并没有明确的解决方案从Eclipse内部分叉JVM。一些更多的研究表明,没有指定的插件就无法完成。我会检查并更新。 – KidCrippler

+0

对于上下文,gradle的默认行为是在单个jvm中运行所有测试https://discuss.gradle.org/t/tests-should-use-one-jvm-per-test-class-not-per-项目/ 12774 – Novaterata

相关问题