2015-08-29 18 views
7

Dopo la cassandra-unit with spring example ho trovato i fagioli di primavera non sono collegati in testclass conseguente eccezioni nullpointer. Ho cercato di minimizzare il problema e l'ho trovato, non è probabilmente la parte Cassandra, ma invece la presenza di una @TestExecutionListeners annotazione, insieme ad una classe estesa AbstractTestExecutionListener.TestExecutionListeners annotazione impedisce fagioli primaverili essere cablati in

org.springframework:spring-core:4.2.0.RELEASE (Also fails with 3.2.14.RELEASE). 
org.springframework:spring-test:4.2.0.RELEASE 
junit.junit:4.11 

JVM vendor/version: Java HotSpot(TM) 64-Bit Server VM/1.8.0_40 
MAC OS X 10.10.5 

mia TestClass assomiglia:

@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners({ AppTestListener.class }) <-- OK when removed 
@ContextConfiguration(classes = { TestConfiguration.class }) 

public class MyTest { 
    @Autowired 
    private MyService myService; 

    @Test 
    public void testMyService() { 
    Assert.assertNotNull(myService); 
    Assert.assertEquals("didit", myService.doIt()); 
    } 
} 

AppTestListener:

public class AppTestListener extends AbstractTestExecutionListener { 
    @Override 
    public void beforeTestMethod(TestContext testContext) throws Exception { 
    System.out.println("test"); 
    } 
} 

Niente di speciale nella classe di configurazione (e fallisce anche per XML di configurazione):

@Configuration 
public class TestConfiguration { 
    @Bean 
    public MyService myService() { 
    return new MyService(); 
    } 
} 

Quando Rimuovo l'annotazione @TestExecutionListeners in MyTest, il test termina come previsto, ma lasciare che l'annotazione renda l'unittest fallito su assertNotNull. Cosa sta succedendo?

risposta

8

Per cominciare, l'esempio cassandra-unità non è, purtroppo, davvero un buon esempio in quanto porta a problemi, proprio come hai incontrato.

Quando ho rimuovere l'annotazione @TestExecutionListeners nel MyTest test termina come previsto, ma lasciando che l'annotazione rende il unittest fallire sul l'assertNotNull. Che cosa sta succedendo?

Quando si dichiara @TestExecutionListeners(AppTestListener.class) su una classe di test che non si estende qualsiasi altra classe di test annotato con @TestExecutionListeners si sta effettivamente dicendo primavera per caricare solo tua AppTestListener, quando in realtà si vuole utilizzare AppTestListener in combinazione con il default ascoltatori provenienti da Spring (ad esempio, lo DependencyInjectionTestExecutionListener che aggiunge il supporto per l'iniezione delle dipendenze dei bean da ApplicationContext).

Per ulteriori informazioni, si prega di leggere l'intera sezione TestExecutionListener configuration del manuale di riferimento di primavera.

Ecco come risolvere il problema.

Prima Spring Framework 4,1

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
@TestExecutionListeners({ 
    CassandraUnitTestExecutionListener.class, 
    DependencyInjectionTestExecutionListener.class, 
    DirtiesContextTestExecutionListener.class, 
    TransactionalTestExecutionListener.class 
}) 
@CassandraUnit 
public class MyCassandraUnitTest { 

    @Test 
    public void xxx_xxx() { 
    } 
} 

Dopo Spring Framework 4,1

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
@TestExecutionListeners(
    listeners = CassandraUnitTestExecutionListener.class, 
    mergeMode = MERGE_WITH_DEFAULTS 
) 
@CassandraUnit 
public class MyCassandraUnitTest { 

    @Test 
    public void xxx_xxx() { 
    } 
} 

saluti,

Sam (autore della primavera TestContext quadro)

P.S. Ho creato un issue for Cassandra Unit in modo che lo risolvano nei loro esempi.