JUnit测试在Eclipse中通过,但在Maven Surefire中失败


97

我已经使用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插件有任何特殊配置吗?
马特b

@matt我的pom中没有用于surefire的任何配置
Abhinav Sarkar 2010年

1
我来这篇文章是因为我遇到了同样的问题,但就我而言,我使用了另一种解决方案。在测试中启用DEBUG日志后,我发现Spring Framework正在查看一个旧的MongoDB数据库名称,并且该名称是在我的工作区中另一个项目创建的jar的旧版本中设置的(尽管它是使用新名称)。一些Maven Clen +删除了我的.m2上的库,然后通过Maven安装所有这些项目解决了该问题。尽管该项目没有理由看一个旧的罐子(不幸的是,它被缓存在某个地方)
Cotta

Answers:


108

我遇到了同样的问题(JUnit测试在Maven Surefire中失败了,但在Eclipse中通过了),并通过将forkMode 始终设置为pom.xml中的maven surefire配置来解决了这个问题:

<插件>
    <groupId> org.apache.maven.plugins </ groupId>
    <artifactId> maven-surefire-plugin </ artifactId>
    <version> 2.12 </ version>
    <配置>
        <forkMode>总是</ forkMode>
    </ configuration>
</ plugin>

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

编辑(2014年1月):

正如PeterPerháč指出的那样,自Surefire 2.14开始不推荐使用forkMode参数。从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>

有关更多信息,请参见前叉选项和并行测试执行


谢谢!为我解决了此问题。知道为什么吗?
亚历克斯

6
很高兴听到。就我而言,问题很可能是JUnit测试读取的配置文件保留在内存中,从而破坏了后续测试的结果。当forkMode设置为true时,每个测试类将完全独立于另一个测试类执行,从而确保执行测试时不会产生副作用。
simon 2012年

4
刚刚使用surefire 2.16尝试了此操作,并得到:“自版本2.14起,不推荐使用参数forkMode。请改用forkCount和redirectForks。” 因此请注意,这仅适用于2.14之前的版本
PeterPerháč13

1
您很可能会使用更高的fork数量,这里的重点是不会重复使用fork,而单个fork将使软件包构建花费很长时间。
桑迪·西蒙顿

1
加上两年后更新答案的方法
Gerben Rampaart,2017年

7

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

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

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

正如我首先写的那样,这对于我的测试套件来说还不够,因此我通过删除该<configuration>部分完全禁用了并行功能。


7

我有一个类似的问题,@Autowired虽然在Eclipse中可以正常使用,但是在Maven命令行下测试代码中的注释无法正常工作。我只是将我的JUnit版本从4.4更新到4.9,问题就解决了。

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

5

这并不完全适合您的情况,但是我有同样的想法-运行Maven的测试目标时,在Eclipse中通过的测试失败了。

原来,这是我套件中使用其他软件包进行的测试。这花了我一周的时间来解决!

较早的测试是测试一些Logback类,并从配置文件创建Logback上下文。

后来的测试正在测试Spring的SimpleRestTemplate的子类,并且以某种方式保留了早期的Logback上下文,并启用了DEBUG。这导致在RestTemplate中进行额外的调用以记录HttpStatus等。

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


感谢您的指导。我遇到了类似的问题,其中默认Maven项目具有自动生成的传统测试用例(我忽略了),而我在新的测试用例中使用SpringJUnit4ClassRunner。在自动生成的测试中添加SpringJUnit4ClassRunner批注为我解决了该问题。
Avnish

5

我有类似的问题,但是使用IntelliJ IDEA + Maven + TestNG + spring-test。(当然,spring-test是必不可少的:))当我更改了maven-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

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

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

在我们的例子中,差异是由于存在修改测试行为的bean。仅运行JUnit测试会很好,但是运行项目install目标会导致测试用例失败。由于这是正在开发的测试用例,因此立即令人怀疑。

结果是另一个测试用例正在通过Spring实例化一个bean,该bean可以保留到新测试用例执行之前。Bean的存在正在修改某些类的行为并产生失败的结果。

在我们的案例中,解决方案是摆脱最初不需要的bean(但从复制+粘贴枪获得另一个奖励)。

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


3

我有同样的问题,但是对我来说,问题是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)

在这种情况下,这个链接是相关的:confluence.atlassian.com/display/JIRAKB/...
OhadR

...并且在发生gradle的情况下,添加以下内容:test {enableAssertions = false ignoreFailures = true}
OhadR

3

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


2

[我不确定这是否是原始问题的答案,因为此处的stacktrace看起来略有不同,但对其他人可能有用。]

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

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

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


2

我有一个类似的问题:JUnit测试在Maven Surefire中失败,但是当我使用SpringSource Bundle Repository中的JUnit库版本4.11.0时在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窗口中运行单元测试。
Marvo

1

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


0

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

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

如果我从transactionManager bean中删除数据源,则测试将在Eclipse中失败(带有错误)。
Abhinav Sarkar,2010年

0

通常,当测试通过Eclipse并通过Maven失败时,这是类路径问题,因为这是两者之间的主要区别。

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

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


是的,因为在maven测试运行期间,我可以在控制台中看到来自Spring上下文加载的INFO日志。
Abhinav Sarkar,2010年

0

这有助于我解决问题。我有类似的症状,那个行家会失败,但是运行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>

希望这会帮助某人对surefire插件进行故障排除。



0

我有同样的问题,对我来说解决方案是允许Maven处理所有依赖项,包括对本地jar的依赖。我将Maven用于在线依赖项,并为本地依赖项手动配置了构建路径。因此,Maven不了解我手动配置的依赖项。

我使用以下解决方案将本地jar依赖项安装到Maven:

如何在Maven项目中添加本地jar文件?


0

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


-2

您的配置文件很可能位于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对生产代码不可见。
ChristofferHammarström'12年

您添加的链接谈论的是项目之间的依赖性,而不是同一项目的main / test中的依赖性
eis 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.