Kiểm tra JUnit vượt qua trong Eclipse nhưng không thành công trong Maven Surefire


99

Tôi đã viết một số bài kiểm tra JUnit bằng cách sử dụng JUnit 4 và thư viện spring-test. Khi tôi chạy các bài kiểm tra bên trong Eclipse thì chạy tốt và vượt qua. Nhưng khi tôi chạy chúng bằng Maven (trong quá trình xây dựng), chúng không đưa ra lỗi liên quan đến lò xo. Tôi không chắc điều gì đang gây ra sự cố, JUnit, Surefire hay Spring. Đây là mã thử nghiệm của tôi, cấu hình mùa xuân và ngoại lệ mà tôi nhận được từ 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());
            }});
    }

}

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

Ngoại lệ ở 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

bạn có cấu hình đặc biệt nào của plugin chắc chắn trong POM của mình không?
matt b

@ Matt tôi không có bất kỳ cấu hình cho chắc chắn hơn trong pom của tôi
Abhinav Sarkar

1
Tôi đến với bài viết này bởi vì tôi gặp vấn đề tương tự, nhưng trong trường hợp của tôi, tôi đã sử dụng một giải pháp khác. Sau khi bật nhật ký GỠ LỖI trong các thử nghiệm của mình, tôi phát hiện ra rằng Spring Framework đang xem xét một tên cơ sở dữ liệu MongoDB cũ và tên này được đặt trong một phiên bản cũ của một jar được tạo bởi một dự án khác trên không gian làm việc của tôi (mặc dù nó đã được xây dựng nhiều lần với tên mới). Một số Maven Clen + xóa các thư viện trên .m2 của tôi, sau đó là Maven Install của tất cả các dự án đó đã giải quyết được vấn đề. Mặc dù không có lý do gì để dự án xem xét một cái lọ cũ (thật không may, nó đã được lưu trữ ở đâu đó)
Cotta

Câu trả lời:


108

Tôi đã gặp vấn đề tương tự (các bài kiểm tra JUnit không thành công trong Maven Surefire nhưng đã vượt qua trong Eclipse) và đã tìm cách giải quyết nó bằng cách đặt forkMode thành luôn trong cấu hình chắc chắn maven trong pom.xml:

<ký quỹ>
    <groupId> org.apache.maven.plugins </groupId>
    <artifactId> maven-surefire-plugin </artifactId>
    <version> 2,12 </version>
    <cấu hình>
        <forkMode> luôn luôn </forkMode>
    </configuration>
</plugin>

Các thông số của Surefire: http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html

Chỉnh sửa (tháng 1 năm 2014):

Như Peter Perháč đã chỉ ra, tham số forkMode không được dùng nữa kể từ Surefire 2.14. Bắt đầu từ Surefire 2.14, hãy sử dụng cái này để thay thế:

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

Để biết thêm thông tin, hãy xem Tùy chọn ngã ba và Thực hiện kiểm tra song song


Cảm ơn bạn! Đã khắc phục sự cố cho tôi. Bất kỳ ý tưởng tại sao?
Alex

6
Tốt để nghe. Trong trường hợp của tôi, vấn đề rất có thể là do một tệp cấu hình được đọc bởi thử nghiệm JUnit vẫn nằm trong bộ nhớ, làm hỏng kết quả của thử nghiệm tiếp theo. Khi forkMode được đặt thành true, mỗi lớp thử nghiệm được thực thi hoàn toàn không phụ thuộc vào lớp khác đảm bảo rằng các thử nghiệm được thực thi mà không có tác dụng phụ.
simon

4
vừa thử điều này bằng cách sử dụng surefire 2.16 và nhận được: "Tham số forkMode không được chấp nhận kể từ phiên bản 2.14. Hãy sử dụng forkCount và reuseForks để thay thế." vì vậy hãy cẩn thận điều này chỉ hoạt động trước 2,14
Peter Perháč

1
Rất có thể bạn có thể sử dụng số lượng fork cao hơn, điều quan trọng ở đây là các fork không được sử dụng lại và một đợt fork sẽ khiến việc xây dựng gói mất rất nhiều thời gian.
Sandy Simonton

1
Cộng với một cập nhật câu trả lời của bạn hai năm sau đó
Gerben Rampaart

7

Tôi đột nhiên gặp lỗi này và giải pháp cho tôi là vô hiệu hóa để chạy các thử nghiệm song song.

Tỷ lệ của bạn có thể khác nhau, vì tôi có thể giảm số lần kiểm tra thất bại bằng cách định cấu hình chắc chắn để chạy các bài kiểm tra song song bằng ´classes´ .:

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

Như tôi đã viết đầu tiên, điều này là không đủ cho bộ thử nghiệm của tôi, vì vậy tôi hoàn toàn vô hiệu hóa song song bằng cách xóa <configuration>phần này.


7

Tôi gặp sự cố tương tự, chú thích @Autowiredtrong mã thử nghiệm không hoạt động khi sử dụng dòng lệnh Maven trong khi nó hoạt động tốt trong Eclipse. Tôi vừa cập nhật phiên bản JUnit của mình từ 4.4 lên 4.9 và sự cố đã được giải quyết.

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

5

Điều này không chính xác áp dụng cho trường hợp của bạn, nhưng tôi cũng gặp phải điều tương tự - các bài kiểm tra sẽ vượt qua trong Eclipse không thành công khi mục tiêu kiểm tra từ Maven được chạy.

Hóa ra đó là một bài kiểm tra trước đó trong suite của tôi, trong một gói khác . Điều này tôi đã mất một tuần để giải quyết!

Một thử nghiệm trước đó đang kiểm tra một số lớp Logback và tạo bối cảnh Logback từ tệp cấu hình.

Thử nghiệm sau đó đang kiểm tra một lớp con của Spring's SimpleRestTemplate và bằng cách nào đó, ngữ cảnh Logback trước đó đã được tổ chức, với DEBUG đang bật. Điều này khiến các cuộc gọi bổ sung được thực hiện trong RestTemplate để ghi nhật ký HttpStatus, v.v.

Đó là một điều khác để kiểm tra xem một người có bao giờ rơi vào tình huống này hay không. Tôi đã khắc phục sự cố của mình bằng cách đưa một số Mock vào lớp kiểm tra Logback của mình để không có ngữ cảnh Logback thực nào được tạo.


Cảm ơn vì con trỏ. Tôi gặp sự cố tương tự trong đó dự án maven mặc định có trường hợp thử nghiệm truyền thống được tạo tự động (mà tôi đã bỏ qua) trong khi tôi đang sử dụng SpringJUnit4ClassRunner cho các trường hợp thử nghiệm mới của mình. Việc thêm chú thích SpringJUnit4ClassRunner vào thử nghiệm tự động tạo đã giải quyết được vấn đề đó cho tôi.
Avnish

5

Tôi gặp sự cố tương tự, nhưng với IntelliJ IDEA + Maven + TestNG + Spring-test. ( Spring-test tất nhiên là cần thiết :)) Nó đã được sửa khi tôi thay đổi cấu hình của maven-surefire-plugin để vô hiệu hóa các bài kiểm tra chạy song song. Như thế này:

<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

Kết quả thực thi thử nghiệm khác với JUnit runvà khác maven installdường như là triệu chứng cho một số vấn đề.

Việc tắt thực thi kiểm tra sử dụng lại chuỗi cũng đã loại bỏ được triệu chứng trong trường hợp của chúng tôi, nhưng ấn tượng rằng mã không an toàn cho chuỗi vẫn còn mạnh mẽ.

Trong trường hợp của chúng tôi, sự khác biệt là do sự hiện diện của một hạt đậu đã sửa đổi hành vi thử nghiệm. Chỉ chạy thử nghiệm JUnit sẽ cho kết quả tốt, nhưng chạy installmục tiêu dự án sẽ dẫn đến trường hợp thử nghiệm không thành công. Vì nó là trường hợp thử nghiệm đang được phát triển, nó ngay lập tức bị nghi ngờ.

Kết quả là một trường hợp thử nghiệm khác đang khởi tạo một bean thông qua Spring sẽ tồn tại cho đến khi thực thi trường hợp thử nghiệm mới. Sự hiện diện của bean đang sửa đổi hành vi của một số lớp và tạo ra kết quả không thành công.

Giải pháp trong trường hợp của chúng tôi là loại bỏ bean, thứ không cần thiết ngay từ đầu (nhưng một giải thưởng khác từ súng sao chép + dán ).

Tôi đề nghị tất cả những ai có triệu chứng này nên điều tra xem nguyên nhân gốc rễ là gì. Việc tắt sử dụng lại chuỗi trong quá trình thực thi thử nghiệm có thể chỉ ẩn nó.


3

Tôi đã gặp vấn đề tương tự, nhưng vấn đề đối với tôi là các xác nhận Java (ví dụ: khẳng định (num> 0)) không được bật cho Eclipse, nhưng đã được bật khi chạy maven.

Do đó, việc chạy các bài kiểm tra jUnit từ Eclipse không bắt được lỗi xác nhận.

Điều này được làm rõ khi sử dụng jUnit 4.11 (trái ngược với phiên bản cũ hơn mà tôi đang sử dụng) vì nó in ra lỗi xác nhận, ví dụ:

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)

trong trường hợp này, liên kết này có liên quan: confluence.atlassian.com/display/JIRAKB/…
OhadR

... và trong trường hợp gradle, hãy thêm cái này: test {enableAssertions = false ignoreFailures = true}
OhadR 22/02/16

3

Tôi đã gặp vấn đề tương tự với một nguyên nhân khác và do đó giải pháp khác. Trong trường hợp của tôi, tôi thực sự đã gặp lỗi trong đó một đối tượng singleton có một biến thành viên được sửa đổi theo cách không an toàn luồng. Trong trường hợp này, việc tuân theo các câu trả lời được chấp nhận và phá vỡ thử nghiệm song song sẽ chỉ che giấu lỗi đã thực sự được tiết lộ bởi thử nghiệm. Giải pháp của tôi, tất nhiên, là sửa thiết kế để tôi không có hành vi xấu này trong mã của mình.


2

[Tôi không chắc rằng đây là câu trả lời cho câu hỏi ban đầu, vì stacktrace ở đây trông hơi khác một chút, nhưng nó có thể hữu ích cho những người khác.]

Bạn có thể nhận được các bài kiểm tra không thành công trong Surefire khi bạn cũng đang chạy Cobertura (để nhận báo cáo về mã). Điều này là do Cobertura yêu cầu proxy (để đo lường việc sử dụng mã) và có một số loại xung đột giữa những proxy đó và Spring proxy. Điều này chỉ xảy ra khi Spring sử dụng cglib2, trường hợp này sẽ xảy ra nếu, ví dụ, bạn cóproxy-target-class="true" hoặc nếu bạn có một đối tượng đang được ủy quyền không triển khai giao diện.

Cách khắc phục bình thường cho điều này là thêm một giao diện. Vì vậy, ví dụ, DAO phải là giao diện, được thực hiện bởi một lớp DAOImpl. Nếu bạn tự động chuyển hướng trên giao diện, mọi thứ sẽ hoạt động tốt (vì cglib2 không còn cần thiết nữa; có thể sử dụng proxy JDK đơn giản hơn cho giao diện và Cobertura hoạt động tốt với điều này).

Tuy nhiên, bạn không thể sử dụng các giao diện với bộ điều khiển được chú thích (bạn sẽ gặp lỗi thời gian chạy khi cố gắng sử dụng bộ điều khiển trong một servlet) - Tôi không có giải pháp cho các bài kiểm tra Cobertura + Spring mà bộ điều khiển tự động truyền.


2

Tôi đã gặp sự cố tương tự: Kiểm tra JUnit không thành công trong Maven Surefire nhưng đã vượt qua trong Eclipse khi tôi sử dụng thư viện JUnit phiên bản 4.11.0 từ Kho lưu trữ gói SpringSource. Cụ thể:

<dependency>
    <groupId>org.junit</groupId>
    <artifactId>com.springsource.org.junit</artifactId>
    <version>4.11.0</version>
</dependency>

Sau đó, tôi thay thế nó bằng thư viện JUnit phiên bản 4.11 và mọi thứ hoạt động tốt.

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

Điều này đã làm các mẹo cho tôi. Các bài kiểm tra của tôi chạy ngay lập tức khi tôi chạy Maven từ dòng lệnh. Tuy nhiên, trong Eclipse, tôi phải đóng và mở lại dự án trước khi các bài kiểm tra đơn vị chạy trong cửa sổ JUnit.
Marvo

1

Hôm nay tôi gặp sự cố này khi thử nghiệm một phương pháp chuyển đổi một đối tượng có chứa a Mapthành chuỗi JSON. Tôi cho rằng Eclipse và plugin chắc chắn Maven đang sử dụng các JRE khác nhau có các cách triển khai HashMapthứ tự khác nhau hoặc điều gì đó khiến các thử nghiệm chạy qua Eclipse vượt qua và các thử nghiệm chạy qua surefire không assertEqualsthành công ( không thành công). Giải pháp dễ dàng nhất là sử dụng một triển khai Bản đồ có thứ tự đáng tin cậy.


0

Bạn không cần phải đưa Nguồn dữ liệu vào JpaTransactionManager vì EntityManagerFactory đã có nguồn dữ liệu. Hãy thử những cách sau:

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

Các bài kiểm tra không thành công (có lỗi) trong Eclipse nếu tôi xóa nguồn dữ liệu khỏi bean transactionManager.
Abhinav Sarkar

0

Thông thường, khi các bài kiểm tra vượt qua trong eclipse và không thành công với maven thì đó là một vấn đề về classpath vì nó là sự khác biệt chính giữa hai.

Vì vậy, bạn có thể kiểm tra classpath với kiểm tra maven -X và kiểm tra classpath của eclipse thông qua các menu hoặc trong tệp .classpath trong thư mục gốc của dự án của bạn.

Ví dụ, bạn có chắc chắn rằng peopleervice-test.xml nằm trong classpath không?


Có, vì tôi có thể thấy nhật ký INFO từ tải ngữ cảnh Spring trong bảng điều khiển trong quá trình chạy thử nghiệm maven.
Abhinav Sarkar

0

Điều này đã giúp tôi khắc phục sự cố của mình. Tôi đã có một triệu chứng tương tự trong maven đó sẽ không thành công nhưng chạy các bài kiểm tra junit vẫn chạy tốt.

Hóa ra pom.xml mẹ của tôi chứa định nghĩa sau:

    <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.9</version>
      <configuration>
        <forkMode>pertest</forkMode>
        <argLine>-Xverify:none</argLine>
      </configuration>
    </plugin>

Và trong dự án của tôi, tôi ghi đè nó để loại bỏ argLine:

    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
            <forkMode>pertest</forkMode>
            <argLine combine.self="override"></argLine>
          </configuration>
    </plugin>

Hy vọng rằng điều này sẽ giúp ai đó trong việc khắc phục sự cố plugin surefire.



0

Tôi cũng gặp phải vấn đề tương tự và giải pháp cho tôi là cho phép Maven xử lý tất cả các phần phụ thuộc, bao gồm cả các lọ cục bộ. Tôi đã sử dụng Maven cho các phụ thuộc trực tuyến và định cấu hình đường dẫn xây dựng theo cách thủ công cho các phụ thuộc cục bộ. Do đó, Maven không biết về các phụ thuộc mà tôi đã cấu hình theo cách thủ công.

Tôi đã sử dụng giải pháp này để cài đặt các phụ thuộc jar cục bộ vào Maven:

Làm cách nào để thêm tệp jar cục bộ trong dự án maven?


0

Trong trường hợp của tôi, lý do là lỗi trong mã. Thử nghiệm dựa trên một thứ tự nhất định của các phần tử trong a HashSet, hóa ra lại khác khi chạy trong Eclipse hoặc trong Maven Surefire.


-2

Rất có thể các tệp cấu hình của bạn nằm trong src / main / resources , trong khi chúng phải ở trong src / test / resources để hoạt động bình thường trong maven.

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

Tôi đang trả lời câu hỏi này sau hai năm vì tôi không thể tìm thấy câu trả lời này ở đây và tôi nghĩ nó là câu trả lời đúng.


Không, ngược lại. src/main/resourceshiển thị với các thử nghiệm, nhưng src/test/resourceskhông hiển thị với mã sản xuất.
Christoffer Hammarström,

liên kết bạn đã thêm đang nói về sự phụ thuộc giữa các dự án, không nằm trong main / test trong cùng một dự án
eis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.