【问题标题】:JUnit tests pass in Eclipse but fail in Maven SurefireJUnit 测试在 Eclipse 中通过但在 Maven Surefire 中失败
【发布时间】:2011-03-22 21:25:11
【问题描述】:

我已经使用 JUnit 4 和 spring-test 库编写了一些 JUnit 测试。当我在 Eclipse 中运行测试时,运行良好并通过。但是当我使用 Maven 运行它们时(在构建过程中),它们无法给出与 spring 相关的错误。我不确定是什么导致了这个问题,JUnit、Surefire 还是 Spring。这是我的测试代码、spring 配置和我从 Maven 获得的异常:

PersonServiceTest.java

package com.xyz.person.test;

import static com.xyz.person.util.FjUtil.toFjList;
import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;

import com.xyz.person.bo.Person;
import com.xyz.person.bs.PersonService;

import fj.Effect;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:personservice-test.xml" })
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
public class PersonServiceTest {

    @Autowired
    private PersonService service;

    @Test
    @Transactional
    public void testCreatePerson() {
        Person person = new Person();
        person.setName("abhinav");
        service.createPerson(person);

        assertNotNull(person.getId());
    }

    @Test
    @Transactional
    public void testFindPersons() {
        Person person = new Person();
        person.setName("abhinav");
        service.createPerson(person);

        List<Person> persons = service.findPersons("abhinav");
        toFjList(persons).foreach(new Effect<Person>() {
            public void e(final Person p) {
                assertEquals("abhinav", p.getName());
            }});
    }

}

personservice-test.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <import resource="classpath:/personservice.xml" />

    <bean id="datasource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        lazy-init="true">
        <property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver" />
        <property name="url" value="jdbc:derby:InMemoryDatabase;create=true" />
    </bean>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="datasource" />
        <property name="persistenceUnitName" value="PersonService" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="databasePlatform" value="org.hibernate.dialect.DerbyDialect" />
                <property name="showSql" value="true" />
                <property name="generateDdl" value="true" />
            </bean>
        </property>
        <property name="jpaPropertyMap">
            <map>
                <entry key="hibernate.validator.autoregister_listeners" value="false" />
                <entry key="javax.persistence.transactionType" value="RESOURCE_LOCAL" />
            </map>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
        <property name="dataSource" ref="datasource" />
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"
        proxy-target-class="false" />

    <bean id="beanMapper" class="org.dozer.DozerBeanMapper">
        <property name="mappingFiles">
            <list>
                <value>personservice-mappings.xml</value>
            </list>
        </property>
    </bean>

</beans>

Maven 中的异常

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.xyz.person.test.PersonServiceTest
23:18:51,250  WARN JDBCExceptionReporter:77 - SQL Warning: 10000, SQLState: 01J01
23:18:51,281  WARN JDBCExceptionReporter:78 - Database 'InMemoryDatabase' not created, connection made to existing database instead.
23:18:52,937  WARN JDBCExceptionReporter:77 - SQL Warning: 10000, SQLState: 01J01
23:18:52,937  WARN JDBCExceptionReporter:78 - Database 'InMemoryDatabase' not created, connection made to existing database instead.
23:18:52,953  WARN TestContextManager:429 - Caught exception while allowing TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener@359a359a] to process 'after' execution for test: method [public void com.xyz.person.test.PersonServiceTest.testCreatePerson()], instance [com.xyz.person.test.PersonServiceTest@1bc81bc8], exception [org.springframework.transaction.IllegalTransactionStateException: Pre-bound JDBC Connection found! JpaTransactionManager does not support running within DataSourceTransactionManager if told to manage the DataSource itself. It is recommended to use a single JpaTransactionManager for all transactions on a single DataSource, no matter whether JPA or JDBC access.]
java.lang.IllegalStateException: No value for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@3f563f56] bound to thread [main]
        at org.springframework.transaction.support.TransactionSynchronizationManager.unbindResource(TransactionSynchronizationManager.java:199)
        at org.springframework.orm.jpa.JpaTransactionManager.doCleanupAfterCompletion(JpaTransactionManager.java:489)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:1011)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:804)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
        at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:515)
        at org.springframework.test.context.transaction.TransactionalTestExecutionListener.endTransaction(TransactionalTestExecutionListener.java:290)
        at org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:183)
        at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:426)
        at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:90)
        at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
        at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
        at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
        at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:59)
        at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:115)
        at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:102)
        at org.apache.maven.surefire.Surefire.run(Surefire.java:180)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
        at java.lang.reflect.Method.invoke(Method.java:599)
        at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350)
        at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)
23:18:53,078  WARN TestContextManager:377 - Caught exception while allowing TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener@359a359a] to process 'before' execution of test method [public void com.xyz.person.test.PersonServiceTest.testFindPersons()] for test instance [com.xyz.person.test.PersonServiceTest@79f279f2]
org.springframework.transaction.IllegalTransactionStateException: Pre-bound JDBC Connection found! JpaTransactionManager does not support running within DataSourceTransactionManager if told to manage the DataSource itself. It is recommended to use a single JpaTransactionManager for all transactions on a single DataSource, no matter whether JPA or JDBC access.
        at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:304)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
        at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.startTransaction(TransactionalTestExecutionListener.java:507)
        at org.springframework.test.context.transaction.TransactionalTestExecutionListener.startNewTransaction(TransactionalTestExecutionListener.java:269)
        at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:162)
        at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:374)
        at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73)
        at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
        at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
        at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
        at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
        at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:59)
        at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:115)
        at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:102)
        at org.apache.maven.surefire.Surefire.run(Surefire.java:180)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
        at java.lang.reflect.Method.invoke(Method.java:599)
        at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350)
        at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)
Tests run: 3, Failures: 0, Errors: 3, Skipped: 0, Time elapsed: 15.625 sec <<< FAILURE!

Results :

Tests in error:
  testCreatePerson(com.xyz.person.test.PersonServiceTest)
  testCreatePerson(com.xyz.person.test.PersonServiceTest)
  testFindPersons(com.xyz.person.test.PersonServiceTest)

Tests run: 3, Failures: 0, Errors: 3, Skipped: 0

【问题讨论】:

  • 你的 POM 中有没有对 surefire 插件的特殊配置?
  • @matt 我的 pom 中没有任何用于万能的配置
  • 我来这篇文章是因为我遇到了同样的问题,但在我的情况下,我使用了另一种解决方案。在我的测试中启用 DEBUG 日志后,我发现 Spring Framework 正在查看一个旧的 MongoDB 数据库名称,并且这个名称是在我的工作区上另一个项目创建的旧版本的 jar 中设置的(尽管它是用新名称)。一些 Maven Clen + 删除我的 .m2 上的库,然后所有这些项目的 Maven 安装解决了这个问题。尽管项目没有理由查看旧 jar(不幸的是,它被缓存在某个地方)

标签: java spring maven-2 surefire spring-test


【解决方案1】:

您不需要在 JpaTransactionManager 中注入 DataSource,因为 EntityManagerFactory 已经有一个数据源。请尝试以下操作:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
   <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

【讨论】:

  • 如果我从 transactionManager bean 中删除数据源,Eclipse 中的测试会失败(出现错误)。
【解决方案2】:

通常当测试在 eclipse 中通过并在 maven 中失败时,这是一个类路径问题,因为它是两者之间的主要区别。

因此您可以使用 maven -X test 检查类路径,并通过菜单或项目根目录中的 .classpath 文件检查 eclipse 的类路径。

您确定例如 personservice-test.xml 在类路径中吗?

【讨论】:

  • 是的,因为我可以在 maven 测试运行期间在控制台中看到来自 Spring 上下文加载的 INFO 日志。
【解决方案3】:

我有类似的问题,但使用 IntelliJ IDEA + Maven + TestNG + spring-test。 (spring-test 当然是必不可少的 :)) 当我更改 ma​​ven-surefire-plugin 的配置以禁用并行运行测试时,它已修复。像这样:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.9</version>
    <configuration>
        <skipTests>${maven.test.skip}</skipTests>
        <trimStackTrace>false</trimStackTrace>
        <!--<parallel>methods</parallel>-->
        <!-- to skip integration tests -->
        <excludes>
            <exclude>**/IT*Test.java</exclude>
            <exclude>**/integration/*Test.java</exclude>
        </excludes>
    </configuration>
    <executions>
        <execution>
            <id>integration-test</id>
            <phase>integration-test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration>
                <skipTests>${maven.integration-test.skip}</skipTests>
                <!-- Make sure to include this part, since otherwise it is excluding Integration tests -->
                <excludes>
                    <exclude>none</exclude>
                </excludes>
                <includes>
                    <include>**/IT*Test.java</include>
                    <include>**/integration/*Test.java</include>
                </includes>
            </configuration>
        </execution>
    </executions>
</plugin>

【讨论】:

    【解决方案4】:

    我突然遇到这个错误,我的解决方案是禁用并行运行测试。

    您的里程可能会有所不同,因为我可以通过将surefire配置为按“类”运行并行测试来减少失败测试的数量。:

                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.2</version>
                    <configuration>
                        <parallel>classes</parallel>
                        <threadCount>10</threadCount>
                    </configuration>
                </plugin>
    

    正如我最初写的那样,这对于我的测试套件来说还不够,所以我通过删除 &lt;configuration&gt; 部分完全禁用了并行。

    【讨论】:

      【解决方案5】:

      这并不完全适用于您的情况,但我也有同样的情况——在 Eclipse 中通过的测试在运行 Maven 的测试目标时失败了。

      原来是在我的套件中进行的早期测试,在不同的包中。这花了我一周的时间来解决!

      之前的测试是测试一些 Logback 类,并从配置文件创建了一个 Logback 上下文。

      后来的测试是测试 Spring 的 SimpleRestTemplate 的一个子类,不知何故,早期的 Logback 上下文被保持,并打开了 DEBUG。这导致在 RestTemplate 中进行额外调用以记录 HttpStatus 等。

      检查一个人是否陷入这种情况是另一回事。我通过将一些 Mocks 注入我的 Logback 测试类来解决我的问题,因此没有创建真正的 Logback 上下文。

      【讨论】:

      • 感谢您的指点。我遇到了类似的问题,默认 maven 项目自动生成了一个传统的测试用例(我忽略了它),而我使用 SpringJUnit4ClassRunner 来处理我的新测试用例。在自动生成的测试中添加 SpringJUnit4ClassRunner 注释为我解决了这个问题。
      【解决方案6】:

      我遇到了类似的问题,测试代码中的注释@Autowired 在使用 Maven 命令行时不起作用,而在 Eclipse 中运行良好。我刚刚将我的 JUnit 版本从 4.4 更新到 4.9,问题就解决了。

      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.13.1</version>
      </dependency>
      

      【讨论】:

        【解决方案7】:

        今天我在测试一种将包含Map 的对象转换为 JSON 字符串的方法时遇到了这个问题。我假设 Eclipse 和 Maven surefire 插件使用不同的 JRE,这些 JRE 具有不同的 HashMap 排序或其他实现,这导致通过 Eclipse 运行的测试通过并且通过surefire运行的测试失败(assertEquals 失败)。最简单的解决方案是使用具有可靠排序的 Map 实现。

        【讨论】:

          【解决方案8】:

          我遇到了同样的问题(JUnit 测试在 Maven Surefire 中失败,但在 Eclipse 中通过)并通过在pom.xml:

          org.apache.maven.pluginsmaven-surefire-plugin2.12版本> 总是配置> 插件>

          Surefire 参数:http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html

          编辑(2014 年 1 月):

          正如Peter Perháč 所指出的,forkMode 参数自 Surefire 2.14 起已弃用。从 Surefire 2.14 开始改用这个:

          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.16</version>
              <configuration>
                  <reuseForks>false</reuseForks>
                  <forkCount>1</forkCount>
              </configuration>
          </plugin>
          

          欲了解更多信息,请参阅Fork Options and Parallel Test Execution

          【讨论】:

          • 很高兴听到。在我的情况下,问题很可能是 JUnit 测试读取的配置文件保留在内存中,从而破坏了后续测试的结果。当 forkMode 设置为 true 时,每个测试类都完全独立于另一个测试类执行,以保证测试的执行没有副作用。
          • 刚刚使用 surefire 2.16 进行了尝试并得到:“参数 forkMode 自 2.14 版以来已弃用。请改用 forkCount 和 reuseForks。”所以请注意这仅适用于 2.14 之前的版本
          • 您很可能会使用更多的分叉数,这里的重要性是分叉不会被重复使用,并且单个分叉会使包构建需要很长时间。
          • 加一个用于两年后更新你的答案
          • @SteveChambers 我来晚了一点,但我认为每个 cpu 核心 1 个是合理的(forkCount=1C) - 当然它确实取决于构建机器。
          【解决方案9】:

          [我不确定这是对原始问题的回答,因为这里的堆栈跟踪看起来略有不同,但它可能对其他人有用。]

          当您还运行 Cobertura 时,您可能会在 Surefire 中测试失败(以获取代码覆盖率报告)。这是因为 Cobertura 需要代理(用于衡量代码使用),并且这些代理与 Spring 代理之间存在某种冲突。这在 Spring 使用 cglib2 时发生,例如,如果您有 proxy-target-class="true",或者如果您有一个未实现接口的代理对象。

          对此的正常修复是添加一个接口。因此,例如,DAO 应该是由 DAOImpl 类实现的接口。如果您在接口上自动装配,一切都会正常工作(因为不再需要 cglib2;可以使用更简单的接口 JDK 代理,而 Cobertura 可以正常工作)。

          但是,您不能将接口与带注释的控制器一起使用(尝试在 servlet 中使用控制器时会出现运行时错误)- 我没有用于自动装配控制器的 Cobertura + Spring 测试的解决方案。

          【讨论】:

            【解决方案10】:

            您的配置文件很可能在 src/main/resources 中,而它们必须在 src/test/resources 下才能在 maven 下正常工作。

            https://cwiki.apache.org/UIMA/differences-between-running-unit-tests-in-eclipse-and-in-maven.html

            两年后我才回复这个问题,因为我在这里找不到这个答案,我认为它是正确的。

            【讨论】:

            • 不,恰恰相反。 src/main/resources 对测试可见,但 src/test/resources 对生产代码不可见。
            • 您添加的链接是关于 项目之间的依赖关系,而不是在同一个项目的 main/test 中
            【解决方案11】:

            我遇到了同样的问题,但对我来说问题是 Java 断言(例如 assert(num > 0))没有为 Eclipse 启用,但在运行 maven 时启用。

            因此从 Eclipse 运行 jUnit 测试并没有触发断言错误。

            这在使用 jUnit 4.11(与我使用的旧版本相反)时很清楚,因为它会打印出断言错误,例如

            java.lang.AssertionError: null
                at com.company.sdk.components.schema.views.impl.InputViewHandler.<init>(InputViewHandler.java:26)
                at test.com.company.sdk.util.TestSchemaExtractor$MockInputViewHandler.<init>(TestSchemaExtractor.java:31)
                at test.com.company.sdk.util.TestSchemaExtractor.testCreateViewToFieldsMap(TestSchemaExtractor.java:48)
            

            【讨论】:

            【解决方案12】:

            这有助于我解决问题。我有类似的症状,maven 会失败,但运行 junit 测试运行良好。

            事实证明,我的父 pom.xml 包含以下定义:

                <plugin>
                  <artifactId>maven-surefire-plugin</artifactId>
                  <version>2.9</version>
                  <configuration>
                    <forkMode>pertest</forkMode>
                    <argLine>-Xverify:none</argLine>
                  </configuration>
                </plugin>
            

            在我的项目中,我覆盖它以删除 argLine:

                <plugin>
                   <artifactId>maven-surefire-plugin</artifactId>
                   <configuration>
                        <forkMode>pertest</forkMode>
                        <argLine combine.self="override"></argLine>
                      </configuration>
                </plugin>
            

            希望这将有助于某人排除万无一失的插件故障。

            【解决方案13】:

            我遇到了类似的问题:当我使用 SpringSource Bundle Repository 中的 JUnit 库版本 4.11.0 时,JUnit 测试在 Maven Surefire 中失败,但在 Eclipse 中通过。特别是:

            <dependency>
                <groupId>org.junit</groupId>
                <artifactId>com.springsource.org.junit</artifactId>
                <version>4.11.0</version>
            </dependency>
            

            然后我将其替换为以下 JUnit 库版本 4.11,一切正常。

            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
            </dependency>
            

            【讨论】:

            • 这对我有用。当我从命令行运行 Maven 时,我的测试立即运行。然而,在 Eclipse 中,我必须先关闭并重新打开项目,然后单元测试才能在 JUnit 窗口中运行。
            【解决方案14】:

            我遇到了同样的问题,我的解决方案是让 Maven 处理所有依赖项,包括本地 jars。我使用 Maven 进行在线依赖,并为本地依赖手动配置构建路径。 因此,Maven 不知道我手动配置的依赖项。

            我使用这个解决方案将本地 jar 依赖安装到 Maven 中:

            How to add local jar files in maven project?

            【讨论】:

              【解决方案15】:

              我遇到了类似的问题,但原因不同,因此解决方案也不同。就我而言,我实际上遇到了一个错误,即单例对象以非线程安全的方式修改了成员变量。在这种情况下,遵循公认的答案并规避并行测试只会隐藏测试实际揭示的错误。当然,我的解决方案是修复设计,这样我的代码中就不会出现这种不良行为。

              【讨论】:

                【解决方案16】:

                JUnit runmaven install 不同的测试执行结果似乎是几个问题的症状。

                禁用线程重用测试执行也确实消除了我们案例中的症状,但代码不是线程安全的印象仍然很强烈。

                在我们的例子中,差异是由于存在修改测试行为的 bean。只运行 JUnit 测试结果会很好,但运行项目 install 目标会导致测试用例失败。既然是开发中的测试用例,立马就被怀疑了。

                这导致另一个测试用例正在通过 Spring 实例化一个 bean,该 bean 将持续到新测试用例的执行。 bean 的存在正在修改某些类的行为并产生失败的结果。

                在我们的案例中,解决方案是去掉 bean,它一开始就不需要(copy+paste 枪的另一个奖品)。

                我建议每个有这种症状的人调查根本原因是什么。在测试执行中禁用线程重用可能只会隐藏它。

                【讨论】:

                  【解决方案17】:

                  就我而言,原因是代码中的错误。该测试依赖于 HashSet 中元素的特定顺序,结果在 Eclipse 或 Maven Surefire 中运行时会有所不同。

                  【讨论】:

                    【解决方案18】:

                    我遇到了类似的问题,我运行了我的测试,禁止重复使用这样的分叉

                    mvn clean test -DreuseForks=false
                    

                    问题消失了。 缺点是整体测试执行时间会更长,这就是为什么您可能希望仅在必要时从命令行执行此操作

                    【讨论】:

                      猜你喜欢
                      • 2012-08-05
                      • 2010-10-12
                      • 1970-01-01
                      • 2014-03-08
                      • 1970-01-01
                      • 2013-11-08
                      • 2016-03-22
                      • 1970-01-01
                      • 2013-08-16
                      相关资源
                      最近更新 更多