JUnit परीक्षण ग्रहण में गुजरते हैं लेकिन मावेन सरेफायर में विफल होते हैं


97

मैंने JUnit 4 और वसंत-परीक्षण पुस्तकालयों का उपयोग करके कुछ JUnit परीक्षण लिखे हैं। जब मैं ग्रहण के अंदर परीक्षण चलाता हूं तो ठीक चलता हूं और गुजरता हूं। लेकिन जब मैं उन्हें मावेन (निर्माण प्रक्रिया के दौरान) का उपयोग करके चलाता हूं, तो वे वसंत से संबंधित त्रुटि देने में विफल होते हैं। मुझे यकीन नहीं है कि समस्या का कारण क्या है, JUnit, Surefire या स्प्रिंग। यहाँ मेरा परीक्षण कोड, स्प्रिंग कॉन्फ़िगरेशन और मावेन से मिलने वाला अपवाद है:

PersonServiceTest.java

package com.xyz.person.test;

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

import java.util.List;

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

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

import fj.Effect;

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

    @Autowired
    private PersonService service;

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

        assertNotNull(person.getId());
    }

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

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

}

personservice-test.xml

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

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

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

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

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

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

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

</beans>

मावेन में अपवाद

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

Results :

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

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

क्या आपके पास अपने पोम में अचूक प्लगइन का कोई विशेष विन्यास है?
मैट बी

@ मट्टा के पास मेरे पोम में
अभिनव के

1
मैं इस लेख पर आया क्योंकि मुझे वही समस्या थी, लेकिन मेरे मामले में मैंने एक और समाधान का उपयोग किया। मेरे परीक्षणों पर DEBUG लॉग को सक्षम करने के बाद, मुझे पता चला कि स्प्रिंग फ्रेमवर्क एक पुराने MongoDB डेटाबेस नाम को देख रहा था, और यह नाम मेरे कार्यक्षेत्र पर एक अन्य परियोजना द्वारा बनाए गए जार के एक पुराने संस्करण में सेट किया गया था (हालांकि इसे कई बार बनाया गया था नया नाम)। कुछ Maven Clen + ने मेरे .m2 पर लाइब्रेरीज़ को डिलीट किया और उसके बाद Maven ने उन सभी प्रॉजेक्ट्स की प्रॉब्लम हल की। हालाँकि इस परियोजना के लिए एक पुराने जार को देखने का कोई कारण नहीं था (यह कहीं पर कैश किया गया था, दुर्भाग्य से)
Cotta

जवाबों:


108

मुझे भी यही समस्या थी (जेवेन टेस्ट मावेन स्योरफायर में फेल हो गया लेकिन एक्लिप्स में पास हो गया) और फोर्कमोड को हमेशा के लिए पॉम.एक्सएमएल में मावेन अचूक कॉन्फ़िगरेशन में सेट करके इसे हल करने में कामयाब रहा :

<प्लगइन>
    <ग्रुप> org.apache.maven.plugins </ ग्रुप>
    <ArtifactId> Maven-अचूक-प्लगइन </ artifactId>
    <Version> 2.12 </ version>
    <विन्यास>
        <ForkMode> हमेशा </ forkMode>
    </ विन्यास>
</ प्लगइन>

अचूक पैरामीटर: http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html

संपादित करें (जनवरी 2014):

जैसा कि पीटर पेराहिक ने बताया, फोर्कमोड पैरामीटर को अचूक 2.14 से हटा दिया गया है। 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>

अधिक जानकारी के लिए Fork Options और Parallel Test Execution देखें


धन्यवाद! मेरे लिए मुद्दा तय किया। कोई विचार क्यों?
एलेक्स

6
सुन कर अच्छा लगा। मेरे मामले में समस्या यह थी कि जेयूनीट परीक्षण द्वारा पढ़ी गई एक कॉन्फ़िगरेशन फ़ाइल मेमोरी में रुकी थी, बाद के परीक्षण के परिणाम को दूषित कर रही थी। जब forMMode को सही पर सेट किया जाता है, तो प्रत्येक परीक्षण वर्ग को पूरी तरह से अन्य गारंटी के साथ निष्पादित किया जाता है कि परीक्षण बिना साइड इफेक्ट्स के निष्पादित किए जाते हैं।
सिमोन

4
बस अचूक २.१६ का उपयोग करके इसे आज़माया गया और पाया गया: "संस्करण २.१४ के बाद से पैरामीटर forkMode को हटा दिया गया है। इसके बजाय forkkount और reuseForks का उपयोग करें।" इसलिए यह केवल पूर्व
-२४१४

1
आप सबसे अधिक संभावना एक उच्च कांटा गिनती का उपयोग कर सकते हैं, यहां महत्व यह है कि कांटे का पुन: उपयोग नहीं किया जाता है और एक एकल कांटा पैकेज बनाता है एक बहुत लंबा समय लगेगा।
सैंडी सिमोनटन

1
इसके अलावा दो साल बाद अपने जवाब को अपडेट करने के लिए एक
Gerben Rampaart

7

मुझे अचानक इस त्रुटि का अनुभव हुआ, और मेरे लिए समाधान समानांतर में परीक्षण चलाने के लिए अक्षम करना था।

आपका माइलेज अलग-अलग हो सकता है, क्योंकि मैं toclasses vary द्वारा समानांतर परीक्षणों को चलाने के लिए अचूक परीक्षण को कॉन्फ़िगर करके असफल परीक्षणों की संख्या कम कर सकता हूं।

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

जैसा कि मैंने पहले लिखा था, यह मेरे परीक्षण सूट के लिए पर्याप्त नहीं था, इसलिए मैंने <configuration>अनुभाग को हटाकर समानांतर पूरी तरह से अक्षम कर दिया ।


7

मुझे इसी तरह की समस्या थी, @Autowiredटेस्ट कोड में एनोटेशन ने मावेन कमांड लाइन का उपयोग करके काम नहीं किया, जबकि यह एक्लिप्स में ठीक काम करता था। मैं सिर्फ 4.4 से 4.9 तक अपने JUnit संस्करण को अपडेट करता हूं और समस्या हल हो गई।

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

5

यह वास्तव में आपकी स्थिति पर लागू नहीं होता है, लेकिन मेरे पास एक ही बात थी - मावेन की ओर से टेस्ट गोल चलने पर एक्लिप्स में पास होने वाले परीक्षण विफल हो गए।

यह एक अलग पैकेज में , मेरे सूट में पहले एक परीक्षण था । इसे हल करने में मुझे एक सप्ताह लग गया!

पहले का परीक्षण कुछ लॉगबैक कक्षाओं का परीक्षण कर रहा था, और एक विन्यास फाइल से लॉगबैक संदर्भ बनाया।

बाद में परीक्षण स्प्रिंग के SimpleRestTemplate के एक उपवर्ग का परीक्षण कर रहा था, और किसी तरह, पहले लॉगबैक संदर्भ को DEBUG पर आयोजित किया गया था। इससे HttpStatus, आदि को लॉग करने के लिए RestTemplate में अतिरिक्त कॉल किए गए।

यह जाँचना एक और बात है कि क्या कोई इस स्थिति में जाता है। मैंने अपने लॉगबैक टेस्ट क्लास में कुछ मोक्स इंजेक्ट करके अपनी समस्या को ठीक किया, ताकि कोई वास्तविक लॉगबैक संदर्भ न बने।


सूचक के लिए धन्यवाद। मैं इसी तरह की समस्या से ग्रस्त था, जहां डिफ़ॉल्ट मावेन परियोजना में एक पारंपरिक परीक्षण मामला ऑटोगेनरेटेड (जिसे मैंने अनदेखा किया था) था, जबकि मैं अपने नए परीक्षण मामलों के लिए SpringJUnit4ClassRunner का उपयोग कर रहा था। ऑटोजेनरेटेड परीक्षण में स्प्रिंगजैनिट 4 क्लैसरनर एनोटेशन को जोड़ने से यह मेरे लिए हल हो गया।
अवनीश

5

मुझे भी ऐसी ही समस्या है, लेकिन इंटेलीजे आईडिया + मावेन + टेस्टएनजी + स्प्रिंग-टेस्ट के साथ। ( वसंत-परीक्षण निश्चित रूप से आवश्यक है :)) यह तब तय किया गया था जब मैंने समानांतर परीक्षणों में निष्क्रिय करने के लिए मावेन-एंस्टीफ़ायर-प्लगइन का कॉन्फ़िगरेशन बदल दिया था । ऐशे ही:

<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लक्ष्य चलाने से परीक्षण परीक्षण विफल हो जाएगा। चूंकि यह विकास के तहत परीक्षण का मामला था, इसलिए यह तुरंत संदिग्ध था।

इसका नतीजा यह हुआ कि एक अन्य परीक्षण मामला स्प्रिंग के माध्यम से एक बीन को तत्काल तैयार कर रहा था जो नए परीक्षण मामले के निष्पादन तक जीवित रहेगा। बीन की उपस्थिति कुछ वर्गों के व्यवहार को संशोधित कर रही थी और असफल परिणाम उत्पन्न कर रही थी।

हमारे मामले में समाधान सेम से छुटकारा पा रहा था, जिसे पहली जगह ( कॉपी + पेस्ट बंदूक से एक और पुरस्कार ) की आवश्यकता नहीं थी।

मैं इस लक्षण के साथ हर किसी को यह जांचने का सुझाव देता हूं कि मूल कारण क्या है। परीक्षण निष्पादन में थ्रेड का पुन: उपयोग अक्षम करना केवल इसे छिपा सकता है।


3

मेरे पास एक ही मुद्दा था, लेकिन मेरे लिए समस्या यह थी कि जावा अभिकथन (उदाहरण के लिए (संख्या> 0)) ग्रहण के लिए सक्षम नहीं थे, लेकिन मावेन चलाते समय सक्षम थे।

इसलिए एक्लिप्स से जनीट परीक्षणों को चलाने से जोरदार त्रुटि को पकड़ नहीं पाया।

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

... और ग्रेडेल के मामले में, इसे जोड़ें: टेस्ट {enableAssertions = false Ignailailures = true}
OhadR

3

मुझे एक अलग कारण के साथ एक समान समस्या थी और इसलिए अलग समाधान। मेरे मामले में, मुझे वास्तव में एक त्रुटि मिली थी जहां एक सिंगलटन ऑब्जेक्ट एक गैर-थ्रेड्सबॉफ़ तरीके से संशोधित एक सदस्य चर था। इस मामले में, स्वीकृत उत्तरों का पालन करना और समानांतर परीक्षण को दरकिनार करना केवल उस त्रुटि को छिपाएगा जो वास्तव में परीक्षण द्वारा प्रकट की गई थी। मेरा समाधान, निश्चित रूप से, डिज़ाइन को ठीक करना है ताकि मेरे कोड में यह बुरा व्यवहार न हो।


2

[मुझे यकीन नहीं है कि यह मूल प्रश्न का उत्तर है, क्योंकि यहाँ स्टैकट्रेस थोड़ा अलग दिखता है, लेकिन यह दूसरों के लिए उपयोगी हो सकता है।]

जब आप कोबर्टुरा (कोड कवरेज रिपोर्ट प्राप्त करने के लिए) भी चला रहे हैं, तो आप श्योरफायर में परीक्षण विफल हो सकते हैं। ऐसा इसलिए है क्योंकि कोबर्टा को परदे के पीछे (कोड उपयोग को मापने के लिए) की आवश्यकता होती है और उन और स्प्रिंग प्रॉक्सियों के बीच किसी तरह का संघर्ष होता है। यह केवल तब होता है जब स्प्रिंग cglib2 का उपयोग करता है, जो कि अगर, उदाहरण के लिए, आपके पास होगाproxy-target-class="true" , या यदि आपके पास कोई ऐसी वस्तु है जो अनुमानित है जिसे इंटरफेस लागू नहीं करता है।

इसके लिए सामान्य फिक्स एक इंटरफ़ेस जोड़ना है। इसलिए, उदाहरण के लिए, DAO इंटरफेस होना चाहिए, DAOImpl वर्ग द्वारा कार्यान्वित किया जाता है। यदि आप इंटरफ़ेस पर ऑटॉयर करते हैं, तो सब कुछ ठीक चलेगा (क्योंकि cglib2 की अब आवश्यकता नहीं है; इंटरफ़ेस के लिए एक सरल JDK प्रॉक्सी को इसके बजाय इस्तेमाल किया जा सकता है और कोबर्तुरा इसके साथ ठीक काम करता है)।

हालाँकि, आप एनोटेट नियंत्रक के साथ इंटरफेस का उपयोग नहीं कर सकते हैं (एक सर्वलेट में नियंत्रक का उपयोग करने का प्रयास करते समय आपको एक रनटाइम त्रुटि मिलेगी) - मेरे पास कोबेटुरा + स्प्रिंग परीक्षणों के लिए एक समाधान नहीं है जो नियंत्रक को स्वायत्त करता है।


2

मुझे इसी तरह की समस्या थी: जेवेनिट परीक्षण मावेन सरेफायर में विफल रहे, लेकिन एक्लिप्स में पास हो गए जब मैंने स्प्रिंगसोर्स बंडल रिपोजिटरी से जुनेट लाइब्रेरी संस्करण 4.11.0 का उपयोग किया। particulary:

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

इसने मेरे लिए चाल चली। जब मैं मावेन को कमांड लाइन से चलाता था, तो मेरी परीक्षाएं तुरंत चलती थीं। ग्रहण में, हालांकि, मुझे परियोजना को बंद करना पड़ा और फिर से खोलना पड़ा, इससे पहले कि यूनिट परीक्षण JUnit विंडो में चलेंगे।
मार्वो

1

मुझे यह समस्या आज एक ऐसी विधि का परीक्षण करने में मिली जिसने एक वस्तु को परिवर्तित किया जिसमें Mapएक JSON स्ट्रिंग था। मुझे लगता है कि ग्रहण और मावेन अचूक प्लगइन अलग-अलग JRE का उपयोग कर रहे थे HashMap, जिसमें ऑर्डर या कुछ और करने के अलग-अलग कार्यान्वयन थे , जिसके कारण इग्लेस के माध्यम से परीक्षण पास होते थे और परीक्षण अचूक के माध्यम से विफल ( assertEqualsअसफल) होते थे। सबसे आसान समाधान था कि मानचित्र के कार्यान्वयन का उपयोग करना, जिसमें विश्वसनीय व्यवस्था थी।


0

EntityManagerFactory पहले से ही एक डेटा स्रोत है क्योंकि आप JpaTransactionManager में एक DataSource इंजेक्षन करने की जरूरत नहीं है। निम्नलिखित प्रयास करें:

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

यदि मैं लेन-देन प्रबंधक बीन से डेटा स्रोत हटाता हूं तो परीक्षण ग्रहण में विफल (त्रुटियों के साथ) है।
अभिनव सरकार

0

आमतौर पर जब परीक्षण ग्रहण में गुजरते हैं और मावेन के साथ विफल हो जाते हैं तो यह एक क्लासपैथ मुद्दा है क्योंकि यह दोनों के बीच मुख्य अंतर है।

तो आप क्लास -पैथ को मावेन -एक्स टेस्ट के साथ देख सकते हैं और अपने प्रोजेक्ट के रूट में एक्लिप्स या क्लास के माध्यम से एक्लिप्स के क्लासपाथ को चेक कर सकते हैं।

क्या आप उदाहरण के लिए सुनिश्चित हैं कि personervice-test.xml classpath में है?


हां, क्योंकि मैं मावेन टेस्ट रन के दौरान कंसोल में स्प्रिंग संदर्भ लोडिंग से जानकारी लॉग देख सकता हूं।
अभिनव सरकार

0

इससे मुझे अपनी समस्या के निवारण में मदद मिली है। मेरे पास मावेन में एक समान लक्षण थे, हालांकि रनिंग जूनियर परीक्षण ठीक चल रहे थे।

जैसा कि यह पता चला है कि मेरे मूल 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

मेरे पास एक ही समस्या थी, और मेरे लिए समाधान था कि मावेन को स्थानीय जार सहित सभी निर्भरता को संभालने की अनुमति दी जाए। मैंने ऑनलाइन निर्भरता के लिए मावेन का उपयोग किया, और स्थानीय निर्भरता के लिए मैन्युअल रूप से निर्मित पथ को कॉन्फ़िगर किया। इस प्रकार, मावेन को उन निर्भरताओं के बारे में पता नहीं था, जिन्हें मैंने स्वयं कॉन्फ़िगर किया था।

मैंने इस समाधान का उपयोग मावेन में स्थानीय जार निर्भरता को स्थापित करने के लिए किया था:

मावेन परियोजना में स्थानीय जार फाइलें कैसे जोड़ें?


0

मेरे मामले में कारण कोड में एक बग था। परीक्षण तत्वों के एक निश्चित क्रम पर निर्भर करता था HashSet, जो कि ग्रहण में या मावी सुरेफ़र में चलाने पर अलग हो जाता था।


-2

यह सबसे अधिक संभावना है कि आपकी कॉन्फ़िगरेशन फाइलें src / main / resource में हैं , जबकि उन्हें maven के तहत ठीक से काम करने के लिए src / test / resource के अंतर्गत होना चाहिए ।

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

मैं दो साल बाद इसका जवाब दे रहा हूं क्योंकि मुझे यह जवाब यहां नहीं मिला और मुझे लगता है कि यह सही है।


नहीं, यह दूसरा तरीका है। src/main/resourcesपरीक्षण के लिए दृश्यमान है, लेकिन src/test/resourcesउत्पादन कोड के लिए दृश्यमान नहीं है।
क्रिस्टोफर हैमरस्ट्रॉम

आपके द्वारा जोड़ा गया लिंक परियोजनाओं के बीच निर्भरता के बारे में बात कर रहा है , एक ही परियोजना में मुख्य / परीक्षण के भीतर नहीं
eis
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.