JUnitテストはEclipseでパスしますが、Maven Surefireで失敗します


96

JUnit 4とスプリングテストライブラリを使用して、いくつかのJUnitテストを作成しました。Eclipse内でテストを実行すると、問題なく実行され、合格します。しかし、(ビルドプロセス中に)Mavenを使用してそれらを実行すると、スプリング関連のエラーが発生して失敗します。JUnit、Surefire、Springのどれが問題の原因かはわかりません。これが私のテストコード、Spring構成、およびMavenから取得した例外です:

PersonServiceTest.java

package com.xyz.person.test;

import static com.xyz.person.util.FjUtil.toFjList;
import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;

import com.xyz.person.bo.Person;
import com.xyz.person.bs.PersonService;

import fj.Effect;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:personservice-test.xml" })
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
public class PersonServiceTest {

    @Autowired
    private PersonService service;

    @Test
    @Transactional
    public void testCreatePerson() {
        Person person = new Person();
        person.setName("abhinav");
        service.createPerson(person);

        assertNotNull(person.getId());
    }

    @Test
    @Transactional
    public void testFindPersons() {
        Person person = new Person();
        person.setName("abhinav");
        service.createPerson(person);

        List<Person> persons = service.findPersons("abhinav");
        toFjList(persons).foreach(new Effect<Person>() {
            public void e(final Person p) {
                assertEquals("abhinav", p.getName());
            }});
    }

}

personservice-test.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <import resource="classpath:/personservice.xml" />

    <bean id="datasource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        lazy-init="true">
        <property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver" />
        <property name="url" value="jdbc:derby:InMemoryDatabase;create=true" />
    </bean>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="datasource" />
        <property name="persistenceUnitName" value="PersonService" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="databasePlatform" value="org.hibernate.dialect.DerbyDialect" />
                <property name="showSql" value="true" />
                <property name="generateDdl" value="true" />
            </bean>
        </property>
        <property name="jpaPropertyMap">
            <map>
                <entry key="hibernate.validator.autoregister_listeners" value="false" />
                <entry key="javax.persistence.transactionType" value="RESOURCE_LOCAL" />
            </map>
        </property>
    </bean>

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

    <tx:annotation-driven transaction-manager="transactionManager"
        proxy-target-class="false" />

    <bean id="beanMapper" class="org.dozer.DozerBeanMapper">
        <property name="mappingFiles">
            <list>
                <value>personservice-mappings.xml</value>
            </list>
        </property>
    </bean>

</beans>

Mavenの例外

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.xyz.person.test.PersonServiceTest
23:18:51,250  WARN JDBCExceptionReporter:77 - SQL Warning: 10000, SQLState: 01J01
23:18:51,281  WARN JDBCExceptionReporter:78 - Database 'InMemoryDatabase' not created, connection made to existing database instead.
23:18:52,937  WARN JDBCExceptionReporter:77 - SQL Warning: 10000, SQLState: 01J01
23:18:52,937  WARN JDBCExceptionReporter:78 - Database 'InMemoryDatabase' not created, connection made to existing database instead.
23:18:52,953  WARN TestContextManager:429 - Caught exception while allowing TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener@359a359a] to process 'after' execution for test: method [public void com.xyz.person.test.PersonServiceTest.testCreatePerson()], instance [com.xyz.person.test.PersonServiceTest@1bc81bc8], exception [org.springframework.transaction.IllegalTransactionStateException: Pre-bound JDBC Connection found! JpaTransactionManager does not support running within DataSourceTransactionManager if told to manage the DataSource itself. It is recommended to use a single JpaTransactionManager for all transactions on a single DataSource, no matter whether JPA or JDBC access.]
java.lang.IllegalStateException: No value for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@3f563f56] bound to thread [main]
        at org.springframework.transaction.support.TransactionSynchronizationManager.unbindResource(TransactionSynchronizationManager.java:199)
        at org.springframework.orm.jpa.JpaTransactionManager.doCleanupAfterCompletion(JpaTransactionManager.java:489)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:1011)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:804)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
        at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:515)
        at org.springframework.test.context.transaction.TransactionalTestExecutionListener.endTransaction(TransactionalTestExecutionListener.java:290)
        at org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:183)
        at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:426)
        at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:90)
        at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
        at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
        at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
        at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:59)
        at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:115)
        at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:102)
        at org.apache.maven.surefire.Surefire.run(Surefire.java:180)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
        at java.lang.reflect.Method.invoke(Method.java:599)
        at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350)
        at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)
23:18:53,078  WARN TestContextManager:377 - Caught exception while allowing TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener@359a359a] to process 'before' execution of test method [public void com.xyz.person.test.PersonServiceTest.testFindPersons()] for test instance [com.xyz.person.test.PersonServiceTest@79f279f2]
org.springframework.transaction.IllegalTransactionStateException: Pre-bound JDBC Connection found! JpaTransactionManager does not support running within DataSourceTransactionManager if told to manage the DataSource itself. It is recommended to use a single JpaTransactionManager for all transactions on a single DataSource, no matter whether JPA or JDBC access.
        at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:304)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
        at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.startTransaction(TransactionalTestExecutionListener.java:507)
        at org.springframework.test.context.transaction.TransactionalTestExecutionListener.startNewTransaction(TransactionalTestExecutionListener.java:269)
        at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:162)
        at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:374)
        at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73)
        at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
        at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
        at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
        at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
        at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:59)
        at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:115)
        at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:102)
        at org.apache.maven.surefire.Surefire.run(Surefire.java:180)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
        at java.lang.reflect.Method.invoke(Method.java:599)
        at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350)
        at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)
Tests run: 3, Failures: 0, Errors: 3, Skipped: 0, Time elapsed: 15.625 sec <<< FAILURE!

Results :

Tests in error:
  testCreatePerson(com.xyz.person.test.PersonServiceTest)
  testCreatePerson(com.xyz.person.test.PersonServiceTest)
  testFindPersons(com.xyz.person.test.PersonServiceTest)

Tests run: 3, Failures: 0, Errors: 3, Skipped: 0

POMに確実なプラグインの特別な設定がありますか?
matt b

@matt私は私のpomに確実な設定をしていません
Abhinav Sarkar

1
同じ問題があったのでこの記事に行きましたが、私の場合は別のソリューションを使用しました。テストでDEBUGログを有効にした後、Spring Frameworkが古いMongoDBデータベース名を調べており、この名前がワークスペース上の別のプロジェクトによって作成された古いバージョンのjarに設定されていることがわかりました(ただし、新しい名前)。一部のMaven Clen +で私の.m2上のライブラリを削除してから、それらすべてのプロジェクトをMavenインストールすることで問題が解決しました。プロジェクトが古いjarファイルを確認する理由はありませんでした(残念ながら、どこかにキャッシュされていました)
Cotta

回答:


108

私は同じ問題を抱えており(JUnitテストはMaven Surefireで失敗しましたが、Eclipseで合格しました)、pom.xmlのmaven surefire構成で常にforkModeを設定することで解決できました。

<プラグイン>
    <groupId> org.apache.maven.plugins </ groupId>
    <artifactId> maven-surefire-plugin </ artifactId>
    <version> 2.12 </ version>
    <構成>
        <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とreloadForksを使用してください。」したがって、これは2.14より前でのみ機能することに注意してください
PeterPerháč2013

1
より高いフォーク数を使用する可能性が最も高く、ここで重要なことは、フォークが再利用されず、単一のフォークでパッケージのビルドに非常に長い時間がかかることです。
Sandy Simonton 2016年

1
さらに、2年後に解答を更新するための1つ
Gerben Rampaart 2017年

7

私は突然このエラーを経験しました、そして私のための解決策は並行してテストを実行することを無効にすることでした。

「クラス」によって並列テストを実行するように確実に構成することで、失敗するテストの数を減らすことができるため、あなたの走行距離は異なる場合があります。

            <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

これはあなたの状況に正確には当てはまりませんが、私は同じことをしました-Eclipseでパスするテストは、Mavenのテスト目標が実行されたときに失敗しました。

私のスイートの以前の別のパッケージでのテストであることが判明しました。解決に1週間かかりました。

以前のテストでは、いくつかのLogbackクラスをテストし、構成ファイルからLogbackコンテキストを作成しました。

後のテストでは、SpringのSimpleRestTemplateのサブクラスをテストしていました。DEBUGがオンの状態で、以前のLogbackコンテキストが保持されていました。これにより、RestTemplateで余分な呼び出しが行われ、HttpStatusなどがログに記録されました。

これがこの状況に陥ったかどうかを確認することは別のことです。実際のLogbackコンテキストが作成されないように、いくつかのモックをLogbackテストクラスに挿入して問題を修正しました。


ポインタをありがとう。新しいテストケースにSpringJUnit4ClassRunnerを使用していたのに対し、デフォルトのmavenプロジェクトに従来のテストケースが自動生成された(無視した)場合、同様の問題が発生しました。自動生成されたテストにSpringJUnit4ClassRunnerアノテーションを追加すると、解決されました。
Avnish 2015年

5

私は同様の問題を抱えていますが、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>

4

テストの実行結果がと異なるのはJUnit runmaven installいくつかの問題の症状のようです。

テストの実行を再利用するスレッドを無効にしても、このケースの症状は解消されましたが、コードがスレッドセーフではないという印象は依然として強かったです。

私たちの場合、違いはテストの動作を変更するBeanの存在によるものでした。JUnitテストのみを実行するinstallと問題ありませんが、プロジェクトターゲットを実行するとテストケースが失敗します。開発中のテストケースだったので、すぐに怪しくなりました。

その結果、別のテストケースがSpringを通じてBeanをインスタンス化し、新しいテストケースが実行されるまで存続することになります。Beanの存在により、一部のクラスの動作が変更され、失敗した結果が生成されていました。

私たちのケースでの解決策は、そもそも不要だったBeanを取り除くことでした(まだ、コピー+ペーストガンからの別の賞品)。

根本的な原因が何であるかを調査するために、私はこの症状を持つすべての人に勧めます。テストの実行でスレッドの再利用を無効にすると、非表示になるだけです。


3

同じ問題がありましたが、問題は、Javaアサーション(assert(num> 0)など)がEclipseでは有効になっておらず、Mavenの実行時に有効になっていることでした。

したがって、EclipseからjUnitテストを実行しても、アサーションエラーはトリガーされませんでした。

これは、jUnit 4.11を使用すると(私が使用していた古いバージョンとは対照的に)アサーションエラーを出力するため、明確になります。

java.lang.AssertionError: null
    at com.company.sdk.components.schema.views.impl.InputViewHandler.<init>(InputViewHandler.java:26)
    at test.com.company.sdk.util.TestSchemaExtractor$MockInputViewHandler.<init>(TestSchemaExtractor.java:31)
    at test.com.company.sdk.util.TestSchemaExtractor.testCreateViewToFieldsMap(TestSchemaExtractor.java:48)

この場合には、このリンクは関連性がある:confluence.atlassian.com/display/JIRAKB/...
OhadR

...そしてgradleの場合、これを追加します:test {enableAssertions = false ignoreFailures = true}
OhadR

3

別の原因、したがって別の解決策で同様の問題がありました。私の場合、実際には、シングルトンオブジェクトがスレッドセーフでない方法で変更されたメンバー変数を持っているというエラーが発生しました。この場合、受け入れられた回答に従い、並行テストを回避しても、テストによって実際に明らかにされたエラーのみが隠されます。もちろん、私の解決策は、コードにこのような不正な動作が発生しないように設計を修正することです。


2

[ここでのスタックトレースは少し異なるように見えるので、これが元の質問に対する答えであるかどうかはわかりませんが、他の人にとっては役立つかもしれません。]

Coberturaも実行している場合(コードカバレッジレポートを取得するため)、Surefireで失敗したテストを取得できます。これは、Coberturaが(コードの使用を測定するために)プロキシを必要とし、それらとSpringプロキシの間に何らかの競合があるためです。これは、Springがcglib2を使用している場合にのみ発生します。たとえば、を持っているproxy-target-class="true"場合や、プロキシされているオブジェクトでインターフェースを実装していない場合などです。

これに対する通常の修正は、インターフェースを追加することです。したがって、たとえば、DAOはインターフェイスであり、DAOImplクラスによって実装される必要があります。インターフェースで自動配線すると、すべてが正常に機能します(cglib2は不要になったため、代わりにインターフェースへのより単純なJDKプロキシを使用でき、Coberturaはこれで正常に機能します)。

ただし、注釈付きコントローラでインターフェースを使用することはできません(サーブレットでコントローラを使用しようとすると、ランタイムエラーが発生します)-コントローラを自動配線するCobertura + Springテストのソリューションがありません。


2

同様の問題がありました。SpringSourceBundle RepositoryのJUnitライブラリバージョン4.11.0を使用すると、JUnitテストがMaven Surefireで失敗しましたが、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

今日、この問題が発生しましたMap。含まれているオブジェクトをJSON文字列に変換するメソッドをテストしました。私はEclipseとMaven surefireプラグインが異なるJREを使用しており、HashMap順序付けなどの実装が異なるため、Eclipseを介して実行されるテストに合格し、surefireを介して実行されるテストが失敗(assertEquals失敗)したと思います。最も簡単な解決策は、信頼できる順序付けを備えたMapの実装を使用することでした。


0

EntityManagerFactoryにはすでにデータソースがあるため、JpaTransactionManagerにDataSourceを挿入する必要はありません。以下を試してください:

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

transactionManager Beanからデータソースを削除すると、Eclipseでテストが(エラーで)失敗します。
Abhinav Sarkar、2010年

0

通常、テストがeclipseで合格し、mavenで失敗する場合、それは2つの主な違いであるため、クラスパスの問題です。

そのため、maven -X testでクラスパスを確認し、メニューまたはプロジェクトのルートの.classpathファイルでeclipseのクラスパスを確認できます。

たとえば、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がローカルjarを含むすべての依存関係を処理できるようにすることでした。オンラインの依存関係にはMavenを使用し、ローカルの依存関係にはビルドパスを手動で構成しました。したがって、Mavenは手動で構成した依存関係を認識していませんでした。

このソリューションを使用して、ローカルjarの依存関係をMavenにインストールしました。

mavenプロジェクトにローカルjarファイルを追加するにはどうすればよいですか?


0

私の場合、理由はコードのバグでした。テストは内の要素の特定の順序に依存していましたがHashSet、EclipseまたはMaven Surefireのいずれかで実行すると、順序が異なることが判明しました。


-2

設定ファイルはsrc / main / resourcesにある可能性が高いですが、Mavenで正しく動作するにはsrc / test / resourcesにある必要があります。

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

私はここでこの答えを見つけることができなかったので、2年後にこれを返信しています。正しい答えだと思います。


いいえ、それは逆です。src/main/resourcesテストからsrc/test/resourcesは見えますが、製品コードからは見えません。
ChristofferHammarström2012

追加したリンクは、依存関係について話している、同じプロジェクト内のメイン/テスト中に、プロジェクトではない
EIS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.