복붙노트

[SPRING] JUnit 테스트는 Eclipse에서는 성공하지만 Maven Surefire에서는 실패합니다.

SPRING

JUnit 테스트는 Eclipse에서는 성공하지만 Maven Surefire에서는 실패합니다.

JUnit 4 및 스프링 테스트 라이브러리를 사용하여 JUnit 테스트를 작성했습니다. 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>

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

해결법

  1. ==============================

    1.나도 같은 문제가 있었다. (JUnit 테스트는 Maven Surefire에서 실패했지만 Eclipse에서는 통과했다.) forkMode를 pom.xml의 maven surefire 설정에 항상 설정하여 해결했다.

    나도 같은 문제가 있었다. (JUnit 테스트는 Maven Surefire에서 실패했지만 Eclipse에서는 통과했다.) forkMode를 pom.xml의 maven surefire 설정에 항상 설정하여 해결했다.

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

    확실한 매개 변수 : http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html

    수정 (2014 년 1 월) :

    Peter Perhác가 지적했듯이, 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>
    

    자세한 내용은 포크 옵션 및 병렬 테스트 실행을 참조하십시오.

  2. ==============================

    2.나는이 오류를 갑자기 경험했고 나를위한 해결책은 테스트를 병렬로 실행하지 못하게하는 것이 었습니다.

    나는이 오류를 갑자기 경험했고 나를위한 해결책은 테스트를 병렬로 실행하지 못하게하는 것이 었습니다.

    '클래스'에 의해 병렬 테스트를 실행하도록 확실하게 구성하여 실패한 테스트의 수를 줄일 수 있기 때문에 귀하의 마일리지가 달라질 수 있습니다.

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

    필자가 먼저 쓴 것처럼, 이것은 내 테스트 스위트에는 충분하지 않기 때문에 섹션을 제거하여 병렬을 완전히 비활성화했다.

  3. ==============================

    3.비슷한 문제가 있었는데 Eclipse에서 잘 작동하는 동안 Maven 명령 행을 사용하여 테스트 코드의 @Autowired 주석이 작동하지 않았다. JUnit 버전을 4.4에서 4.9로 업데이트하고 문제가 해결되었습니다.

    비슷한 문제가 있었는데 Eclipse에서 잘 작동하는 동안 Maven 명령 행을 사용하여 테스트 코드의 @Autowired 주석이 작동하지 않았다. JUnit 버전을 4.4에서 4.9로 업데이트하고 문제가 해결되었습니다.

    <dependency>
        <groupId>junit</groupId
        <artifactId>junit</artifactId>
        <version>4.9</version>
    </dependency>
    
  4. ==============================

    4.비슷한 문제가 있지만 IntelliJ IDEA + Maven + TestNG + 스프링 테스트가 있습니다. (스프링 테스트는 물론 필수적입니다 :)) 병렬 테스트에서 maven-surefire-plugin 설정을 변경하면 문제가 해결되었습니다. 이렇게 :

    비슷한 문제가 있지만 IntelliJ IDEA + Maven + TestNG + 스프링 테스트가 있습니다. (스프링 테스트는 물론 필수적입니다 :)) 병렬 테스트에서 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. ==============================

    5.이것은 상황에 정확히 적용되지는 않지만 같은 일을했습니다. Eclipse에서 통과 될 테스트는 Maven의 테스트 목표가 실행될 때 실패했습니다.

    이것은 상황에 정확히 적용되지는 않지만 같은 일을했습니다. Eclipse에서 통과 될 테스트는 Maven의 테스트 목표가 실행될 때 실패했습니다.

    그것은 내 패키지에서 다른 패키지로 테스트가 더 일찍 나타났다. 해결하는데 일주일이 걸렸습니다!

    초기 테스트는 일부 Logback 클래스를 테스트하고 구성 파일에서 Logback 컨텍스트를 만들었습니다.

    나중의 테스트는 Spring의 SimpleRestTemplate의 서브 클래스를 테스트하고 있었고, 어떻게 든 더 이른 Logback 컨텍스트가 DEBUG on으로 유지되었다. 이로 인해 HttpStatus 등을 기록하기 위해 RestTemplate에서 추가 호출이 이루어졌습니다.

    혹시 이런 상황에 빠지면 확인해야 할 또 다른 일입니다. 내 Logback 테스트 클래스에 일부 Mock을 주입하여 문제를 해결 했으므로 실제 Logback 컨텍스트가 작성되지 않았습니다.

  6. ==============================

    6.나에게는 똑같은 문제가 있었지만 문제는 Java 주장 (예 : assert (num> 0))이 Eclipse에서 사용하도록 설정되지 않았지만 Maven을 실행할 때 사용하도록 설정했기 때문입니다.

    나에게는 똑같은 문제가 있었지만 문제는 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)
    
  7. ==============================

    7.[여기에 stacktrace가 약간 다르기 때문에 이것이 원래 질문에 대한 답이라고 확신하지는 않지만 다른 사람들에게 유용 할 수 있습니다.]

    [여기에 stacktrace가 약간 다르기 때문에 이것이 원래 질문에 대한 답이라고 확신하지는 않지만 다른 사람들에게 유용 할 수 있습니다.]

    Cobertura를 실행할 때 (코드 커버리지 보고서를 얻으려면) Surefire에서 테스트가 실패 할 수 있습니다. 이것은 Cobertura가 (코드 사용을 측정하기 위해) 프록시를 필요로하기 때 문이며, 이들과 스프링 프록시 사이에 일종의 충돌이 있기 때문입니다. 이는 Spring이 cglib2를 사용할 때만 발생합니다. 예를 들어 proxy-target-class = "true"이거나 인터페이스를 구현하지 않는 프록시가있는 객체가있는 경우입니다.

    이에 대한 일반적인 수정은 인터페이스를 추가하는 것입니다. 예를 들어, DAO는 DAOImpl 클래스에 의해 구현 된 인터페이스 여야합니다. 인터페이스에서 autowire하면 모든 것이 정상적으로 작동합니다 (cglib2가 더 이상 필요하지 않으므로 인터페이스에 대한보다 간단한 JDK 프록시를 대신 사용할 수 있으며 Cobertura는 이에 적합합니다).

    그러나 주석이 달린 컨트롤러에는 인터페이스를 사용할 수 없습니다. 서블릿에서 컨트롤러를 사용하려고하면 런타임 오류가 발생합니다. 컨트롤러를 자동 응답하는 Cobertura + Spring 테스트에 대한 솔루션이 없습니다.

  8. ==============================

    8.유사한 문제가있었습니다. JUnit 테스트는 Maven Surefire에서 실패했지만 SpringSource Bundle Repository에서 JUnit 라이브러리 버전 4.11.0을 사용할 때 Eclipse로 전달되었습니다. 분과 :

    유사한 문제가있었습니다. 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>
    
  9. ==============================

    9.나는 다른 원인과 그에 따른 해결책으로 비슷한 문제를 겪었다. 내 경우에는 실제로 싱글 톤 객체가 비 threadsafe 방식으로 수정 된 멤버 변수를 갖는 오류가있었습니다. 이 경우 허용 된 답변을 따르고 병렬 테스트를 우회하면 테스트에서 실제로 발견 된 오류 만 숨겨집니다. 내 솔루션은 물론, 내 코드에서이 나쁜 동작을하지 않도록 디자인을 수정하는 것입니다.

    나는 다른 원인과 그에 따른 해결책으로 비슷한 문제를 겪었다. 내 경우에는 실제로 싱글 톤 객체가 비 threadsafe 방식으로 수정 된 멤버 변수를 갖는 오류가있었습니다. 이 경우 허용 된 답변을 따르고 병렬 테스트를 우회하면 테스트에서 실제로 발견 된 오류 만 숨겨집니다. 내 솔루션은 물론, 내 코드에서이 나쁜 동작을하지 않도록 디자인을 수정하는 것입니다.

  10. ==============================

    10.오늘이 문제는 Map이 포함 된 객체를 JSON 문자열로 변환하는 메서드를 테스트하는 데있었습니다. 필자는 이클립스와 Maven의 surefire 플러그인이 HashMap의 다른 구현을 가지고있는 다른 JRE를 사용하고 있다고 가정한다. 이클립스를 통과 한 테스트가 통과하고 테스트가 실패하여 assertEquals가 실패했다. 가장 쉬운 솔루션은 안정적인 순서가있는 Map 구현을 사용하는 것이 었습니다.

    오늘이 문제는 Map이 포함 된 객체를 JSON 문자열로 변환하는 메서드를 테스트하는 데있었습니다. 필자는 이클립스와 Maven의 surefire 플러그인이 HashMap의 다른 구현을 가지고있는 다른 JRE를 사용하고 있다고 가정한다. 이클립스를 통과 한 테스트가 통과하고 테스트가 실패하여 assertEquals가 실패했다. 가장 쉬운 솔루션은 안정적인 순서가있는 Map 구현을 사용하는 것이 었습니다.

  11. ==============================

    11.JUnit 실행 및 Maven 설치와 다른 테스트 실행 결과는 몇 가지 문제에 대한 증상으로 보입니다.

    JUnit 실행 및 Maven 설치와 다른 테스트 실행 결과는 몇 가지 문제에 대한 증상으로 보입니다.

    쓰레드 재사용 테스트 실행을 비활성화하면 우리의 경우 증상을 없앨 수 있었지만 코드가 쓰레드 안전하지 않다는 인상은 여전히 ​​강했다.

    이 경우 차이점은 테스트 동작을 수정 한 bean이 있기 때문입니다. JUnit 테스트 만 실행하면 문제는 없지만 프로젝트 설치 대상을 실행하면 테스트 케이스가 실패합니다. 개발중인 테스트 케이스 였기 때문에 즉시 의심 스러웠습니다.

    새로운 테스트 케이스가 실행될 때까지 살아남을 수있는 다른 테스트 케이스가 Spring을 통해 bean을 인스턴스화하는 결과를 낳았다. 빈 존재감은 일부 클래스의 동작을 수정하고 실패한 결과를 생성하는 것이 었습니다.

    우리의 경우 해결책은 첫 번째 장소에서 필요하지 않은 콩을 제거하는 것이 었습니다 (사본 + 붙여 넣기 총의 다른 상).

    근본 원인이 무엇인지 조사하기 위해이 증상을 가진 모든 사람에게 제안합니다. 테스트 실행에서 스레드 재사용을 비활성화하면 스레드 실행을 숨길 수 있습니다.

  12. ==============================

    12.EntityManagerFactory에 이미 데이터 소스가 있으므로 JpaTransactionManager에 DataSource를 삽입 할 필요가 없습니다. 다음을 시도하십시오.

    EntityManagerFactory에 이미 데이터 소스가 있으므로 JpaTransactionManager에 DataSource를 삽입 할 필요가 없습니다. 다음을 시도하십시오.

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

    13.보통 테스트가 이클립스로 전달되고 메이븐과 함께 실패 할 때 클래스 패스 문제가된다. 왜냐하면 이것이 두 클래스의 주요 차이점이기 때문이다.

    보통 테스트가 이클립스로 전달되고 메이븐과 함께 실패 할 때 클래스 패스 문제가된다. 왜냐하면 이것이 두 클래스의 주요 차이점이기 때문이다.

    따라서 maven -X test를 사용하여 classpath를 확인하고 메뉴 또는 프로젝트의 루트에있는 .classpath 파일을 통해 Eclipse의 클래스 경로를 확인할 수 있습니다.

    personservice-test.xml이 classpath에 있다는 것을 확신합니까?

  14. ==============================

    14.이것은 내 문제를 해결하는 데 도움이되었습니다. 나는 maven이 실패해도 junit 테스트를 실행해도 문제가없는 비슷한 증상을 보였다.

    이것은 내 문제를 해결하는 데 도움이되었습니다. 나는 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>
    

    바라건대 이것은 확실한 플러그인의 문제 해결에 도움이되기를 바랍니다.

  15. ==============================

    15.나에게는 똑같은 문제가 있었고 나를위한 해결책은 Maven이 로컬 jar를 포함하여 모든 종속성을 처리하도록 허용하는 것이 었습니다. 온라인 종속성에 Maven을 사용하고 로컬 종속성을 위해 수동으로 빌드 경로를 구성했습니다. 따라서, Maven은 내가 수동으로 설정 한 의존성을 알지 못했다.

    나에게는 똑같은 문제가 있었고 나를위한 해결책은 Maven이 로컬 jar를 포함하여 모든 종속성을 처리하도록 허용하는 것이 었습니다. 온라인 종속성에 Maven을 사용하고 로컬 종속성을 위해 수동으로 빌드 경로를 구성했습니다. 따라서, Maven은 내가 수동으로 설정 한 의존성을 알지 못했다.

    이 솔루션을 사용하여 Maven에 로컬 jar 종속성을 설치했습니다.

    메이븐 프로젝트에 로컬 jar 파일을 추가하는 방법?

  16. ==============================

    16.구성 파일은 src / main / resources에 있고, src / test / resources 아래에 있어야 maven에서 제대로 작동합니다.

    구성 파일은 src / main / resources에 있고, src / test / resources 아래에 있어야 maven에서 제대로 작동합니다.

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

    나는이 대답을 여기에서 발견 할 수 없기 때문에 2 년 후에 이것을 회답하고있다. 나는 그것이 올바른 것이라고 생각한다.

  17. from https://stackoverflow.com/questions/3365628/junit-tests-pass-in-eclipse-but-fail-in-maven-surefire by cc-by-sa and MIT license