Тести JUnit проходять в Eclipse, але провалюються в Maven Surefire


99

Я написав кілька тестів JUnit, використовуючи бібліотеки JUnit 4 та spring-test. Коли я запускаю тести всередині Eclipse, тоді працюю нормально і проходжу. Але коли я запускаю їх за допомогою Maven (під час процесу збірки), вони не дають помилки, спричиненої пружиною. Я не впевнений, що спричиняє проблему, JUnit, Surefire чи 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>

Виняток у Мейвені

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

у вас є якась спеціальна конфігурація плагіна surefire у вашому POM?
matt b

@matt У мене немає жодної конфігурації для впевненості у моїй пом
Абхінав Саркар

1
Я прийшов до цієї статті, оскільки в мене була та сама проблема, але в моєму випадку я використав інше рішення. Увімкнувши журнали DEBUG на моїх тестах, я виявив, що Spring Framework розглядає старе ім'я бази даних MongoDB, і це ім'я було встановлено у старій версії банки, створеної іншим проектом у моїй робочій області (хоча вона була побудована кілька разів з нове ім'я). Деякі Maven Clen + видалення бібліотек на моєму .m2, а потім Maven Install всіх цих проектів вирішили проблему. Хоча у проекту не було жодної причини дивитись на стару банку (вона десь була кешована, на жаль)
Котта,

Відповіді:


108

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

<плагін>
    <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 р.):

Як зазначив Петро Перхач , параметр 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>

Для отримання додаткової інформації див. Параметри форків та паралельне виконання тесту


Спасибі! Виправлено проблему для мене. Будь-яка ідея чому?
Алекс

6
Радий чути. У моєму випадку проблема була дуже ймовірна, що файл конфігурації, прочитаний тестом JUnit, залишився в пам'яті, пошкодивши результат наступного тесту. Коли для forkMode встановлено значення true, кожен клас тесту виконується повністю самостійно від іншого, що гарантує, що тести виконуються без побічних ефектів.
simon

4
просто спробував це, використовуючи surefire 2.16, і отримав: "Параметр forkMode застарілий з версії 2.14. Замість цього використовуйте forkCount і reuseForks." так що будьте обережні, це працює лише до
версії

1
Ви, швидше за все, можете скористатися більшим числом форків, тут важливо те, що форки не використовуються повторно, і одна форка змусить складання пакунків тривати дуже довго.
Сенді Саймонтон

1
Плюс один за оновлення вашої відповіді через два роки
Гербен Рампаарт,

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в тестовому коді не працювала за допомогою командного рядка Maven, хоча в Eclipse вона працювала нормально. Я просто оновив свою версію JUnit з 4.4 до 4.9, і проблема була вирішена.

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

5

Це точно не стосується вашої ситуації, але у мене було те ж саме - тести, які проходили б у Eclipse, провалилися, коли було виконано тестове завдання від Maven.

Це виявилося тестом раніше в моєму наборі, в іншому пакеті . Це вирішило у мене тиждень!

У попередньому тесті було тестування деяких класів реєстрації та створено контекст реєстрації з конфігураційного файлу.

Пізніший тест тестував підклас Spring's SimpleRestTemplate, і якимось чином було проведено попередній контекст Logback із включеною DEBUG. Це спричинило додаткові дзвінки в RestTemplate для реєстрації HttpStatus тощо.

Інша справа перевірити, чи потрапляє хтось колись у цю ситуацію. Я вирішив свою проблему, ввівши кілька мокетів у мій тестовий клас Logback, так що реальних контекстів Logback не було створено.


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

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 runі від, maven installздається, є симптомом кількох проблем.

Вимкнення повторного використання тестового виконання потоку також позбулося симптому в нашому випадку, але враження, що код не є безпечним для потоків, все ще залишалося сильним.

У нашому випадку різниця була пов’язана з наявністю бобів, які змінили поведінку тесту. Запуск лише тесту JUnit призведе до нормального результату, але запуск проектуinstall цілі призведе до невдалого тесту. Оскільки це був тестовий випадок, що розроблявся, це відразу викликало підозру.

Це призвело до того, що інший тестовий випадок створював екземпляр компонента через Spring, який вижив би до запуску нового тесту. Присутність компонента модифікувала поведінку деяких класів і давала невдалий результат.

Рішенням у нашому випадку було позбавлення від квасолі, яка в першу чергу не була потрібна (ще один приз від пістолета copy + paste ).

Я пропоную всім, у кого є цей симптом, з’ясувати, в чому полягає основна причина. Вимкнення повторного використання потоку під час виконання тесту може лише приховати його.


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)

у цьому випадку це посилання є актуальним: confluence.atlassian.com/display/JIRAKB/…
OhadR,

... а у випадку gradle, додайте це: test {enableAssertions = false ignoreFailures = true}
OhadR

3

У мене була подібна проблема з іншою причиною і, отже, іншим рішенням. У моєму випадку у мене насправді сталася помилка, коли в синглтон-об'єкті змінна члена була модифікована не безпечним способом. У цьому випадку дотримання прийнятих відповідей та обхід паралельного тестування лише приховає помилку, яку насправді виявив тест. Моє рішення, звичайно, полягає у виправленні дизайну, щоб у мене не було такої поганої поведінки в коді.


2

[Я не впевнений, що це відповідь на вихідне запитання, оскільки стек тут виглядає дещо інакше, але може бути корисним для інших.]

Ви можете отримати невдалі тести в Surefire, коли ви також використовуєте Cobertura (щоб отримати звіти про покриття коду). Це пов’язано з тим, що Cobertura вимагає проксі (для вимірювання використання коду), і існує якийсь конфлікт між цими та Spring проксі. Це відбувається лише тоді, коли Spring використовує cglib2, що було б у випадку, якщо, наприклад, у вас єproxy-target-class="true" , або якщо у вас є об'єкт, який проксі-проксі, який не реалізує інтерфейси.

Звичайним виправленням цього є додавання інтерфейсу. Так, наприклад, DAO повинні бути інтерфейсами, реалізованими класом DAOImpl. Якщо ви автоматично підключите інтерфейс, все буде працювати нормально (оскільки cglib2 більше не потрібен; замість нього можна використовувати простіший проксі-сервер JDK, і Cobertura з цим чудово працює).

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


2

У мене була подібна проблема: тести JUnit не вдалися в Maven Surefire, але пройшли в Eclipse, коли я використовував бібліотеку JUnit версії 4.11.0 із сховища SpringSource Bundle. Особливості:

<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

У мене була ця проблема сьогодні при тестуванні методу, який перетворив об'єкт, що містив a, Mapу рядок JSON. Я припускаю, що Eclipse та плагін Maven surefire використовували різні JRE, які мали різні реалізації HashMapвпорядкування або щось інше, що спричинило проходження тестів, запущених через Eclipse, і тестів, які пройшли через surefire, не assertEqualsвдалося ( не вдалося). Найпростішим рішенням було використання реалізації Map, яка мала надійне впорядкування.


0

Вам не потрібно вводити DataSource в JpaTransactionManager, оскільки EntityManagerFactory вже має джерело даних. Спробуйте наступне:

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

Тести не виконуються (з помилками) в Eclipse, якщо я видалю джерело даних із компонента transactionManager.
Абхінав Саркар

0

Зазвичай, коли тести проходять в затемненні і не дають результатів з maven, це проблема шляху до класу, оскільки це основна різниця між ними.

Таким чином, ви можете перевірити шлях до класу за допомогою тесту maven -X і перевірити шлях до затемнення за допомогою меню або у файлі .classpath у кореневій частині вашого проекту.

Ви впевнені, наприклад, що personservice-test.xml знаходиться у шляху до класу?


Так, тому що я бачу журнали INFO із контекстного завантаження Spring у консолі під час тестового запуску maven.
Абхінав Саркар

0

Це допомогло мені вирішити проблему. У мене були подібні симптоми в тому, що maven зазнав би невдачі, проте запуск тестів на джуніт працює нормально.

Як виявляється, мій батько 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>

Сподіваємось, це допоможе комусь у вирішенні несправностей плагіна.



0

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

Я використав це рішення для встановлення локальних залежностей jar в Maven:

Як додати локальні файли jar у проект maven?


0

У моєму випадку причиною була помилка коду. Тест спирався на певний порядок елементів в a 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не видно для виробничого коду.
Christoffer Hammarström

посилання ви додається говорити про залежність між проектами, а не в основному / тесті в одному проекті
ейс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.