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


99

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

POM에 확실한 플러그인의 특별한 구성이 있습니까?
matt b

@ 매트 내 치어의 확실한에 대한 구성이 없습니다
Abhinav 사카

1
나는 같은 문제가 있었기 때문에이 기사에 왔지만 내 경우에는 다른 해결책을 사용했습니다. 내 테스트에서 DEBUG 로그를 활성화 한 후 Spring Framework가 이전 MongoDB 데이터베이스 이름을보고 있음을 발견했으며이 이름은 내 작업 공간의 다른 프로젝트에서 만든 이전 버전의 jar에 설정되어 있습니다. 새 이름). 일부 Maven Clen + 내 .m2에서 라이브러리를 삭제 한 다음 모든 프로젝트의 Maven 설치가 문제를 해결했습니다. 프로젝트가 오래된 항아리를 볼 이유가 없었지만 (불행히도 어딘가에 캐시되었습니다)
Cotta

답변:


108

나는 동일한 문제가 있었고 (JUnit 테스트는 Maven Surefire에서 실패했지만 Eclipse에서 통과했습니다) pom.xml의 maven surefire 구성에서 forkMode항상 설정하여 해결했습니다 .

<플러그인>
    <groupId> org.apache.maven.plugins </ groupId>
    <artifactId> maven-surefire-plugin </ artifactId>
    <버전> 2.12 </ 버전>
    <구성>
        <forkMode> 항상 </ forkMode>
    </ 구성>
</ 플러그인>

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

편집 (2014 년 1 월) :

으로 피터 Perháč는 지적의 forkMode 매개 변수는 확실한 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>

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


감사합니다! 나를 위해 문제를 해결했습니다. 왜 그런지 아세요?
Alex

6
듣기 좋네요. 필자의 경우 문제는 JUnit 테스트에서 읽은 구성 파일이 메모리에 남아 후속 테스트 결과를 손상시킬 가능성이 매우 큽니다. forkMode가 true로 설정되면 각 테스트 클래스가 서로 완전히 독립적으로 실행되어 테스트가 부작용없이 실행되도록 보장합니다.
사이먼

4
방금 surefire 2.16을 사용하여 이것을 시도하고 "forkMode 매개 변수는 버전 2.14부터 사용되지 않습니다. 대신 forkCount 및 재사용 Forks를 사용하십시오." 그러니 이것은 2.14 이전에만 작동합니다.
Peter Perháč

1
더 높은 포크 수를 사용할 수 있습니다. 여기서 중요한 점은 포크가 재사용되지 않고 단일 포크로 인해 패키지 빌드에 매우 오랜 시간이 걸린다는 것입니다.
Sandy Simonton

1
게다가 2 년 후에 답변을 업데이트 한
가벤 Rampaart을

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의 서브 클래스를 테스트하는 것이었고, 어떻게 든 DEBUG가 켜진 상태에서 이전 Logback 컨텍스트가 유지되었습니다. 이로 인해 RestTemplate에서 HttpStatus 등을 기록하기 위해 추가 호출이 발생했습니다.

이 상황에 빠졌는지 확인하는 것은 또 다른 일입니다. Logback 테스트 클래스에 일부 Mocks를 주입하여 문제를 해결하여 실제 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 run로부터maven install 여러 가지 문제에 대한 증상 일 것으로 보인다.

테스트 실행을 재사용하는 스레드를 비활성화하면 우리의 경우에도 증상이 제거되었지만 코드가 스레드로부터 안전하지 않다는 인상은 여전히 ​​강력했습니다.

우리의 경우 차이는 테스트 동작을 수정 한 빈의 존재 때문이었습니다. JUnit 테스트 만 실행해도 괜찮지 만 프로젝트 실행install 대상을 테스트 케이스가 실패합니다. 개발중인 테스트 케이스 였기 때문에 즉시 의심 스러웠습니다.

그 결과 다른 테스트 케이스가 새로운 테스트 케이스가 실행될 때까지 존속 할 수있는 Spring을 통해 빈을 인스턴스화했습니다. 빈 존재는 일부 클래스의 동작을 수정하고 실패한 결과를 생성했습니다.

우리의 경우 해결책은 처음에는 필요하지 않은 콩을 제거하는 것이 었습니다 ( 복사 + 붙여 넣기 총 에서 또 다른 상을 받았습니다 ).

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


3

나는 같은 문제가 있었지만 나에게 문제는 Java assertion (eg 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

[여기의 스택 트레이스가 약간 다르게 보이지만 다른 사람들에게는 유용 할 수 있으므로 이것이 원래 질문에 대한 답인지 확실하지 않습니다.]

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

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

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


2

비슷한 문제가 발생했습니다. Maven Surefire에서 JUnit 테스트가 실패했지만 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 2014

1

를 포함하는 객체를 MapJSON 문자열 로 변환하는 메서드를 테스트하는 데이 문제가 발생했습니다 . Eclipse와 Maven surefire 플러그인이 서로 다른 HashMap주문 구현을 가진 다른 JRE를 사용하고 있다고 가정 합니다. 이로 인해 Eclipse를 통해 실행되는 테스트가 통과되고 확실한 테스트가 실패 ( assertEquals실패)되었습니다. 가장 쉬운 해결책은 순서가 신뢰할 수있는 Map 구현을 사용하는 것이 었습니다.


0

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

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

transactionManager bean에서 데이터 소스를 제거하면 Eclipse에서 테스트가 실패합니다 (오류 포함).
Abhinav Sarkar

0

일반적으로 테스트가 이클립스에서 통과하고 maven에서 실패하면 둘 사이의 주요 차이점이기 때문에 클래스 경로 문제입니다.

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

예를 들어 personservice-test.xml이 클래스 경로에 있다고 확신합니까?


예, Maven 테스트 실행 중에 콘솔에서 Spring 컨텍스트로드에서 INFO 로그를 볼 수 있기 때문입니다.
Abhinav Sarkar

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>

바라건대 이것은 확실한 플러그인 문제를 해결하는 데 도움이 될 것입니다.



0

나는 같은 문제가 있었고 나에게 해결책은 Maven이 로컬 항아리를 포함한 모든 종속성을 처리하도록 허용하는 것이 었습니다. 온라인 종속성에는 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

2 년 후에 답장을 드리는 이유는 여기에서이 답변을 찾을 수없고 올바른 답변이라고 생각하기 때문입니다.


아니, 그 반대입니다. src/main/resources테스트 src/test/resources에는 표시 되지만 프로덕션 코드에는 표시되지 않습니다.
Christoffer Hammarström

추가 한 링크는 의존성에 대해 얘기입니다 사이 가 아니라 같은 프로젝트에서 주 / 시험에서 프로젝트
EIS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.