2010-07-29 8 views
57

Я написал несколько тестов JUnit, используя библиотеки JUnit 4 и Spring-test. Когда я запускаю тесты внутри Eclipse, тогда выполняйте штраф и передавайте. Но когда я запускаю их с помощью Maven (во время процесса сборки), они не дают ошибку, связанную с весной. Я не уверен, что вызывает проблему, JUnit, Surefire или Spring. Вот мой тестовый код, конфигурация пружины и исключение, которое я получаю от Maven:Тесты JUnit проходят в Eclipse, но сбой в Maven Surefire

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.springframew[email protected]359a359a] to process 'after' execution for test: method [public void com.xyz.person.test.PersonServiceTest.testCreatePerson()], instance [[email protected]], 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[email protected]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.springframew[email protected]359a359a] to process 'before' execution of test method [public void com.xyz.person.test.PersonServiceTest.testFindPersons()] for test instance [[email protected]] 
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 
+0

У вас есть какая-либо специальная конфигурация плагина surefire в вашем POM? –

+0

@matt У меня нет никакой конфигурации для уверенного в моем pom –

+0

Я пришел к этой статье, потому что у меня была такая же проблема, но в моем случае я использовал другое решение. После включения журналов DEBUG в моих тестах я узнал, что Spring Framework просматривает старое имя базы данных MongoDB, и это имя было настроено в старой версии jar, созданной другим проектом на моем рабочем пространстве (хотя он был создан несколько раз с новое имя). Некоторые Maven Clen + удаление библиотек на моем .m2, за которым следует Maven. Установка всех этих проектов решила проблему. Хотя проект не имел смысла смотреть на старую банку (к сожалению, он был кэширован где-то, к сожалению) – Cotta

ответ

0

Вам не нужно вводить DataSource в JpaTransactionManager, поскольку у EntityManagerFactory уже есть источник данных. Попробуйте следующее:

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

Тесты с ошибкой (с ошибками) в Eclipse, если я удалю источник данных из bean-компонента transactionManager. –

0

Обычно, когда испытания проходят в упадке и не с мавена это проблема, потому что путь к классам главное различие между ними.

Итак, вы можете проверить путь к классу с помощью теста maven -X и проверить путь к классам eclipse через меню или в файле .classpath в корневом каталоге вашего проекта.

Возможно, вы уверены, что personalervice-test.xml находится в пути к классу?

+0

Да, потому что я вижу журналы INFO из загрузки контекста Spring в консоли во время тестового прогона maven. –

4

У меня есть аналогичная проблема, но с IntelliJ IDEA + Maven + TestNG + 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> 
5

Я внезапно испытал эту ошибку, и решение для меня состояло в том, чтобы отключать параллельные тесты.

Ваш пробег может изменяться, так как я мог бы снизить число непройденных тестов по настройке безошибочной для запуска параллельных тестов по'classes' .:

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

Как я писал первый, это не было достаточно для моего набора тестов , поэтому я полностью отключился, удалив раздел <configuration>.

3

Это не совсем применимо к вашей ситуации, но у меня было то же самое - тесты, которые пройдут в Eclipse, не удались, когда была запущена цель тестирования с Maven.

Оказалось, что это был тест ранее в моем номере, в другом пакете. Это заняло у меня неделю, чтобы решить!

Раннее тестирование было проверкой некоторых классов журнала и создало контекст журнала из файла конфигурации.

Более поздний тест тестировал подкласс SpringRestTemplate Spring, и каким-то образом был проведен более ранний контекст журнала, в котором DEBUG включен.Это вызвало дополнительные вызовы в RestTemplate для регистрации HttpStatus и т. Д.

Это еще одна вещь, чтобы проверить, не попал ли в эту ситуацию. Я исправил свою проблему, введя некоторые Mocks в свой тестовый класс Logback, так что никаких реальных контекстов журнала не было создано.

+0

Спасибо за указатель. Я столкнулся с аналогичной проблемой, когда у проекта по умолчанию maven был установлен традиционный тестовый сценарий (который я проигнорировал), в то время как я использовал SpringJUnit4ClassRunner для своих новых тестовых случаев. Добавление комментария SpringJUnit4ClassRunner к автогенерированному тесту разрешило его для меня. – Avnish

5

У меня была аналогичная проблема, аннотация @Autowired в тестовом коде не работала при использовании командной строки Maven, пока она отлично работала в Eclipse. Я просто обновляю версию JUnit с 4.4 до 4.9, и проблема была решена.

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

Я имел эту проблему сегодня тестирует метод, который преобразуется объект, который содержал Map в строку JSON. Я предполагаю, что Eclipse и плагин Maven surefire использовали разные JRE, которые имели разные реализации порядка HashMap или что-то в этом роде, что привело к прохождению тестов через Eclipse, а тесты выполнялись с ошибкой surefire (assertEquals не удалось). Самым простым решением было использование реализации Карты, имеющей надежный порядок.

76

У меня была такая же проблема (JUnit тесты потерпели неудачу в Maven безошибочный, но прошел в Eclipse) и удалось решить, установив forkMode к всегда в Maven конфигурации в верный pom.xml:

 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.12</version> 
    <configuration> 
     <forkMode>always</forkMode> 
    </configuration> 
</plugin> 

Surefire параметры: http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html

Edit (январь 2014):

Как указал 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

+0

Спасибо yoU! Исправлена ​​ошибка. Любая идея почему? –

+4

Приятно слышать. В моем случае проблема была очень вероятна, что файл конфигурации, прочитанный в тесте JUnit, остался в памяти, искажая результат последующего теста. Когда forkMode имеет значение true, каждый тестовый класс выполняется полностью независимо от другого, гарантируя, что тесты выполняются без побочных эффектов. – simon

+3

просто попробовал это с помощью surefire 2.16 и получил: «Параметр forkMode устарел с версии 2.14. Вместо этого используйте forkCount и reuseForks». так что будьте осторожны, это работает только на pre-2.14 –

2

[Я не уверен, что это ответ на первоначальный вопрос, так как StackTrace здесь выглядит несколько иначе, но он может быть полезным для других.]

Вы можете получить тесты в Surefire, если вы также используете Cobertura (чтобы получить отчеты о покрытии кода). Это связано с тем, что Cobertura требует прокси (для измерения использования кода), и существует некоторый конфликт между этими и Spring-прокси. Этот только возникает, когда Spring использует cglib2, что было бы, если, например, у вас есть proxy-target-class="true", или если у вас есть объект, который проксирован, который не реализует интерфейсы.

Нормальное исправление заключается в добавлении интерфейса. Так, например, DAO должны быть интерфейсами, реализуемыми классом DAOImpl. Если вы используете autwire на интерфейсе, все будет работать нормально (потому что cglib2 больше не требуется, вместо этого может использоваться более простой прокси-сервер JDK для интерфейса, и Cobertura отлично работает с этим).

Однако вы не можете использовать интерфейсы с аннотированными контроллерами (вы получите ошибку времени выполнения при попытке использовать контроллер в сервлете). У меня нет решения для тестов Cobertura + Spring, которые управляют автосогласованием.

-2

Это наиболее вероятно, что ваши файлы конфигурации находятся в SRC/основные/ресурсы, в то время как они должны находиться под SRC/тест/ресурсы для правильной работы под мавена.

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

Я ответив это после того, как причины двух лет я не мог найти этот ответ здесь, и я думаю, что это правильный один.

+0

Нет, все наоборот. 'src/main/resources' видится для тестов, но' src/test/resources' не отображается в производственном коде. –

+0

Да, вот и все. – Miguel

+0

ссылка, которую вы добавили, говорит об зависимостях * между * проектами, а не в основном/тесте в том же проекте – eis

3

У меня была такая же проблема, но проблема для меня заключалась в том, что утверждения Java (например, assert (num> 0)) не были включены для Eclipse, но были включены при запуске maven.

Поэтому при запуске тестов jUnit от Eclipse не было обнаружено триггера ошибки утверждения.

Это делается при использовании 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) 
+0

, в этом случае эта ссылка важна: https://confluence.atlassian.com/display/JIRAKB/java.lang .AssertionError + When + Sending + Mail + Via + SMTP – OhadR

+0

...и в случае градации добавьте следующее: test { enableAssertions = false ignoreFailures = true } – OhadR

0

Это помогло мне в решении моих проблем. У меня были аналогичные симптомы, так как 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> 

Надеюсь, это поможет кому-то в устранение неполадок.

1

У меня была аналогичная проблема: тесты JUnit не удалось в Maven Surefire, но прошли в Eclipse, когда я использовал библиотеку JUnit версии 4.11.0 из SpringSource Bundle Repository. Particulary:

<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> 
+0

Это сделало трюк для меня. Мои тесты сразу же запускались, когда я запускал Maven из командной строки. Однако в Eclipse мне пришлось закрыть и повторно открыть проект до того, как юнит-тесты будут выполняться в окне JUnit. – Marvo

0

У меня была такая же проблема, и решение для меня, чтобы Maven для обработки всех зависимостей, в том числе местные банки. Я использовал Maven для онлайн-зависимостей и настраивал путь сборки вручную для локальных зависимостей. Таким образом, Maven не знал о зависимостях, которые я настраивал вручную.

Я использовал это решение для установки локальных зависимостей банки в Maven:

How to add local jar files in maven project?

1

У меня был аналогичной проблема с другой причиной и, следовательно, другим решением. В моем случае у меня на самом деле была ошибка, когда объект singleton имел переменную-член, модифицированную не-поточным способом. В этом случае в соответствии с принятыми ответами и обход параллельного тестирования будет скрыта ошибка, которая была фактически обнаружена в ходе теста. Мое решение, конечно же, заключается в том, чтобы исправить дизайн, чтобы у меня не было такого плохого поведения в моем коде.

0

Результат теста, отличный от JUnit run, и от maven install, по-видимому, является симптомом для нескольких проблем.

Отказ от повторного использования теста повторного использования также избавился от симптома в нашем случае, но впечатление, что код не был потокобезопасным, по-прежнему был сильным.

В нашем случае разница была обусловлена ​​наличием компонента, который модифицировал поведение теста. Выполнение только теста JUnit приведет к прекрасному результату, но запуск проекта install приведет к неудачному тестовому сценарию. Поскольку это был тестовый пример, он был сразу же подозрительным.

Это привело к тому, что другой тестовый пример создавал экземпляр компонента через Spring, который выжил бы до выполнения нового тестового примера. Присутствие bean-компонента изменяло поведение некоторых классов и создавало неудачный результат.

Решение в нашем случае избавлялось от боба, который не был необходим в первую очередь (еще один приз от копия + паста пистолет).

Я предлагаю всем с этим симптомом исследовать причину. Отключение повторного использования потоков при выполнении теста может только скрыть его.

Смежные вопросы