JUnit testleri Eclipse'de geçer ancak Maven Surefire'da başarısız olur


101

JUnit 4 ve bahar testi kitaplıklarını kullanarak bazı JUnit testleri yazdım. Eclipse içinde testleri çalıştırdığımda, iyi koşup geçiyorum. Ancak onları Maven kullanarak çalıştırdığımda (oluşturma işlemi sırasında), yayla ilgili bir hata vererek başarısız oluyorlar. Soruna neyin neden olduğundan emin değilim, JUnit, Surefire veya Spring. İşte test kodum, yay yapılandırmam ve Maven'den aldığım istisna:

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());
            }});
    }

}

Personervice-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'de istisna

-------------------------------------------------------
 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'unuzda surefire eklentisinin herhangi bir özel yapılandırması var mı?
matt b

@matt benim pom içinde Surefire için herhangi bir yapılandırma yok
Abhinav Sarkar

1
Ben de aynı problemi yaşadığım için bu yazıya geldim ama benim durumumda başka bir çözüm kullandım. Testlerimde DEBUG günlüklerini etkinleştirdikten sonra, Spring Framework'ün eski bir MongoDB veritabanı adına baktığını ve bu adın çalışma alanımda başka bir proje tarafından oluşturulan bir jar'ın eski bir sürümünde ayarlandığını öğrendim (ancak birkaç kez oluşturulmuş olmasına rağmen) yeni isim). Bazı Maven Clen + .m2 dosyamdaki kitaplıkları sildikten sonra tüm bu projelerin Maven Kurulumu sorunu çözdü. Projenin eski bir kavanoza bakması için bir neden olmamasına rağmen (maalesef bir yerde önbelleğe alınmıştı)
Cotta

Yanıtlar:


111

Ben aynı problem vardı (JUnit Maven Surefire başarısız ama Eclipse geçirilen testleri) ve ayarlayarak bunu çözmek için yönetilen forkMode için daima maven güzelliğinde yapılandırma içinde pom.xml içinde:

<plugin>
    <groupId> org.apache.maven.plugins </groupId>
    <artifactId> maven-surefire-eklentisi </artifactId>
    <version> 2.12 </version>
    <yapılandırma>
        <forkMode> her zaman </forkMode>
    </configuration>
</plugin>

Surefire parametreleri: http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html

Düzenleme (Ocak 2014):

As Peter Perháč işaret, forkMode parametresi Surefire 2.14 beri kullanımdan kaldırıldı. Surefire 2.14'ten başlayarak bunun yerine şunu kullanın:

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

Daha fazla bilgi için bkz. Çatal Seçenekleri ve Paralel Test Yürütme


6
Duymak güzel. Benim durumumda sorun büyük olasılıkla JUnit testi tarafından okunan bir yapılandırma dosyasının bellekte kalması ve sonraki bir testin sonucunu bozmasıydı. ForkMode true olarak ayarlandığında, her bir test sınıfı diğerinden tamamen bağımsız olarak yürütülür ve testlerin yan etkiler olmaksızın yürütülmesini garanti eder.
simon

4
Bunu surefire 2.16 kullanarak denedim ve: "forkMode parametresi 2.14 sürümünden beri kullanımdan kaldırıldı. Bunun yerine forkCount ve reuseForks kullanın." bu yüzden bunun yalnızca 2.14 öncesi
Peter Perháč

1
Büyük olasılıkla daha yüksek bir çatal sayısı kullanabilirsiniz, buradaki önemli nokta çatalların yeniden kullanılmaması ve tek bir çatalın paket derlemelerinin çok uzun sürmesine neden olmasıdır.
Sandy Simonton

1
Artı, iki yıl sonra cevabınızı güncellemek için bir tane
Gerben Rampaart

1
@SteveChambers Burada biraz geç kaldım, ancak cpu çekirdeği başına 1 tane makul olduğunu düşünüyorum (forkCount = 1C) - tabii ki inşa makinesine bağlı.
Sandy Simonton

7

Birdenbire bu hatayı yaşadım ve benim için çözüm, testleri paralel olarak çalıştırmayı devre dışı bırakmaktı.

Eminfire'ı "sınıflara" göre paralel testler çalıştıracak şekilde yapılandırarak başarısız testlerin sayısını azaltabileceğim için milajınız değişebilir:

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

İlk yazdığım gibi, bu benim test takımım için yeterli değildi, bu yüzden <configuration>bölümü kaldırarak paralelliği tamamen devre dışı bıraktım .


7

Benzer bir sorun yaşadım @Autowired, test kodundaki açıklama , Eclipse'de düzgün çalışırken Maven komut satırı altında çalışmadı. JUnit sürümümü 4.4'ten 4.9'a güncelledim ve sorun çözüldü.

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

5

Bu sizin durumunuz için tam olarak geçerli değil, ama bende de aynı şey vardı - Maven'in test hedefi çalıştırıldığında Eclipse'de geçecek testler başarısız oldu.

Süitimde daha önce farklı bir pakette bir test olduğu ortaya çıktı . Bunu çözmem bir haftamı aldı!

Daha önceki bir test, bazı Logback sınıflarını test ediyordu ve bir yapılandırma dosyasından bir Logback bağlamı oluşturuyordu.

Sonraki test, Spring'in SimpleRestTemplate'inin bir alt sınıfını test etmekti ve bir şekilde, önceki Logback bağlamı DEBUG açıkken tutuldu. Bu, RestTemplate'te HttpStatus, vb. Günlüğü için ekstra çağrıların yapılmasına neden oldu.

Birinin bu duruma girip girmediğini kontrol etmek başka bir şey. Sorunumu, Logback test sınıfıma bazı Mocks enjekte ederek çözdüm, böylece gerçek Logback bağlamları oluşturulmadı.


İşaretçi için teşekkürler. Yeni test durumlarım için SpringJUnit4ClassRunner kullanıyorken, varsayılan maven projesinin otomatik olarak oluşturulmuş geleneksel bir test senaryosuna sahip olduğu (ki bunu görmezden geldiğim) benzer bir problemle karşılaştım. SpringJUnit4ClassRunner ek açıklamasını otomatik oluşturulmuş teste eklemek benim için çözdü.
Avnish

5

Benzer bir problemim var ama IntelliJ IDEA + Maven + TestNG + yay testi ile. ( elbette yay testi gereklidir :)) Yapılandırmayı değiştirdiğimde düzeltildi. Paralel olarak çalıştırma testlerini devre dışı bırakmak için maven-surefire-eklentisinin . Bunun gibi:

<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

Test yürütme sonucu farklı JUnit runve farklımaven install birkaç sorunun belirtisi gibi görünmektedir .

Test yürütmesini tekrar kullanarak iş parçacığını devre dışı bırakmak da bizim durumumuzdaki belirtiden kurtuldu, ancak kodun iş parçacığı açısından güvenli olmadığı izlenimi hala güçlüydü.

Bizim durumumuzda fark, test davranışını değiştiren bir fasulyenin varlığından kaynaklanıyordu. Yalnızca JUnit testinin çalıştırılması iyi sonuç verir, ancak proje installhedefinin çalıştırılması başarısız bir test durumuna neden olur. Geliştirilmekte olan test durumu olduğu için hemen şüpheliydi.

Başka bir test vakasının, yeni test senaryosunun yürütülmesine kadar hayatta kalacak olan Spring aracılığıyla bir fasulyenin somutlaştırılmasıyla sonuçlandı. Fasulye varlığı, bazı sınıfların davranışını değiştiriyor ve başarısız sonucu üretiyordu.

Bizim durumumuzdaki çözüm, ilk etapta ihtiyaç duyulmayan fasulyeden kurtulmaktı (yine kopyala + yapıştır tabancasından bir başka ödül ).

Bu semptomu olan herkese temel nedenin ne olduğunu araştırmasını öneririm. Test yürütmede iş parçacığının yeniden kullanımını devre dışı bırakmak yalnızca onu gizleyebilir.


3

Aynı sorunu yaşadım, ancak benim için sorun, Java iddialarının (örn. Assert (num> 0)) Eclipse için etkinleştirilmemesi, ancak maven çalıştırılırken etkinleştirilmesiydi.

Bu nedenle, Eclipse'den jUnit sınamalarının çalıştırılması, onaylama hatasını tetiklemedi.

Bu, jUnit 4.11'i kullanırken (kullandığım eski sürümün aksine) açıkça anlaşılır çünkü onaylama hatasını yazdırır, örn.

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)

bu durumda, bu bağlantı önemlidir: confluence.atlassian.com/display/JIRAKB/…
OhadR

... ve gradle olması durumunda şunu ekleyin: test {enableAssertions = false ignoreFailures = true}
OhadR

3

Farklı bir nedenden dolayı benzer bir problemim vardı ve bu nedenle farklı bir çözüme sahiptim. Benim durumumda, bir singleton nesnesinin iş parçacığı olmayan bir şekilde değiştirilmiş bir üye değişkene sahip olduğu bir hata yaşadım. Bu durumda, kabul edilen cevapları takip etmek ve paralel testi atlatmak, yalnızca testin gerçekten ortaya çıkardığı hatayı gizleyecektir. Benim çözümüm elbette tasarımı düzeltmek, böylece kodumda bu kötü davranışa sahip olmam.


2

[Bunun orijinal soruya bir cevap olduğundan emin değilim, çünkü buradaki yığın izleme biraz farklı görünüyor, ancak diğerleri için faydalı olabilir.]

Aynı zamanda Cobertura'yı çalıştırırken de (kod kapsamı raporları almak için) Surefire'da başarısız olan testleri alabilirsiniz. Bunun nedeni, Cobertura'nın vekiller gerektirmesidir (kod kullanımını ölçmek için) ve bunlar ile Spring vekilleri arasında bir tür çatışma vardır. Bu, yalnızca Spring cglib2 kullandığında meydana gelir; bu durum, örneğin,proxy-target-class="true" eğer sahipseniz veya arabirimleri uygulamayan proxy uygulanmakta olan bir nesneniz varsa bu durum söz konusudur.

Bunun normal çözümü, bir arayüz eklemektir. Bu nedenle, örneğin DAO'lar, DAOImpl sınıfı tarafından uygulanan arabirimler olmalıdır. Arabirimde otomatik kablolama yaparsanız, her şey yolunda gider (çünkü artık cglib2 gerekli değildir; bunun yerine arabirim için daha basit bir JDK proxy kullanılabilir ve Cobertura bununla iyi çalışır).

Bununla birlikte, açıklamalı denetleyicilerle arabirimleri kullanamazsınız (denetleyiciyi bir sunucu uygulamasında kullanmaya çalışırken çalışma zamanı hatası alırsınız) - Cobertura + Yay testleri için otomatik kablolu denetleyicileri kullanan bir çözümüm yok.


2

Benzer bir sorun yaşadım: JUnit testleri Maven Surefire'da başarısız oldu, ancak SpringSource Bundle Repository'den JUnit kitaplığı sürüm 4.11.0'ı kullandığımda Eclipse'de geçti. Özellikle:

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

Sonra onu aşağıdaki JUnit kitaplığı sürüm 4.11 ile değiştirdim ve her şey yolunda gidiyor.

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

Bu benim için hile yaptı. Maven'i komut satırından çalıştırdığımda testlerim hemen yapıldı. Ancak Eclipse'de, birim testleri JUnit penceresinde çalışmadan önce projeyi kapatıp yeniden açmam gerekiyordu.
Marvo

1

Bugün bu problemi, içeren bir nesneyi MapJSON dizesine dönüştüren bir yöntemi test ettim . Eclipse ve Maven surefire eklentisinin, farklı HashMapsipariş uygulamaları veya başka bir şey içeren farklı JRE'ler kullandığını varsayıyorum , bu da Eclipse üzerinden yapılan testlerin geçmesine ve surefire aracılığıyla yapılan testlerin başarısız olmasına ( assertEqualsbaşarısız) neden oldu. En kolay çözüm, güvenilir sıralamaya sahip bir Harita uygulaması kullanmaktı.


0

EntityManagerFactory zaten bir veri kaynağına sahip olduğundan, JpaTransactionManager'da bir DataSource enjekte etmenize gerek yoktur. Takip etmeyi dene:

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

Veri kaynağını transactionManager çekirdeğinden kaldırırsam, Eclipse'de testler başarısız oluyor (hatalarla).
Abhinav Sarkar

0

Genellikle testler tutulmadan geçtiğinde ve maven ile başarısız olduğunda, bu bir sınıf yolu sorunudur çünkü ikisi arasındaki temel fark budur.

Böylece maven -X testi ile sınıf yolunu kontrol edebilir ve menüler aracılığıyla veya projenizin kök dizinindeki .classpath dosyasında tutulmanın sınıf yolunu kontrol edebilirsiniz.

Örneğin, personervice-test.xml dosyasının sınıf yolunda olduğundan emin misiniz?


Evet, çünkü maven test çalıştırması sırasında konsolda Spring bağlamından INFO günlüklerini görebiliyorum.
Abhinav Sarkar

0

Bu, sorunumu gidermeme yardımcı oldu. O maven'de benzer semptomlar yaşadım, ancak junit testlerini çalıştırmak iyi çalışıyor.

Görünüşe göre ana pom.xml dosyam aşağıdaki tanımı içeriyor:

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

Ve projemde argLine'ı kaldırmak için onu geçersiz kılıyorum:

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

Umarım bu, emin ateş eklentisinde sorun gidermede birine yardımcı olur.



0

Aynı sorunu yaşadım ve benim için çözüm, Maven'in yerel kavanozlar dahil tüm bağımlılıkları yönetmesine izin vermekti. Çevrimiçi bağımlılıklar için Maven'i kullandım ve derleme yolunu yerel bağımlılıklar için manuel olarak yapılandırdım. Bu nedenle Maven, manuel olarak yapılandırdığım bağımlılıkların farkında değildi.

Bu çözümü yerel jar bağımlılıklarını Maven'e yüklemek için kullandım:

Maven projesine yerel jar dosyaları nasıl eklenir?


0

Benim durumumda sebep koddaki bir hataydı. Test HashSet, Eclipse veya Maven Surefire'da çalıştırıldığında farklı olduğu ortaya çıkan, a'daki belirli bir öğe sırasına dayanıyordu .


-2

Yapılandırma dosyalarınız büyük olasılıkla src / main / kaynaklarda bulunurken, src / test / kaynaklar altında olmaları gerekir. maven altında düzgün çalışması .

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

Bunu iki yıl sonra yanıtlıyorum çünkü bu yanıtı burada bulamadım ve bunun doğru olduğunu düşünüyorum.


Hayır, tam tersi. src/main/resourcestestler tarafından görülebilir, ancak src/test/resourcesüretim kodu tarafından görülmez.
Christoffer Hammarström

Eklediğiniz bağlantı aynı projedeki main / test içinde değil, projeler arasındaki bağımlılıklardan bahsediyor
eis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.