2017-10-13 1 views
1

Dies wurde möglicherweise falsch codiert, aber jede Idee, wie es getan werden sollte, wird geschätzt.NPE auf Feder-Autowires Formular TestExecutionListener


Ich habe diese Klasse TestClass die viele Serviceklasse injizieren muss. Da ich @BeforeClass auf @Autowired Objekte nicht verwenden kann, ergebe ich mich auf AbstractTestExecutionListener. Alles funktionierte wie erwartet, aber wenn ich auf @Test Blöcke bin, werden alle Objekte ausgewertet null.

Irgendeine Idee, wie man das löst?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = { ProjectConfig.class }) 
@TestExecutionListeners({ TestClass.class }) 
public class TestClass extends AbstractTestExecutionListener { 

    @Autowired private FirstService firstService; 
    // ... other services 

    // objects needs to initialise on beforeTestClass and afterTestClass 
    private First first; 
    // ... 

    // objects needs to be initialised on beforeTestMethod and afterTestMethod 
    private Third third; 
    // ... 

    @Override public void beforeTestClass(TestContext testContext) throws Exception { 
     testContext.getApplicationContext().getAutowireCapableBeanFactory().autowireBean(this); 

     first = firstService.setUp(); 
    } 

    @Override public void beforeTestMethod(TestContext testContext) throws Exception { 
     third = thirdService.setup(); 
    } 

    @Test public void testOne() { 
     first = someLogicHelper.recompute(first); 
     // ... 
    } 

    // other tests 

    @Override public void afterTestMethod(TestContext testContext) throws Exception { 
     thirdService.tearDown(third); 
    } 

    @Override public void afterTestClass(TestContext testContext) throws Exception { 
     firstService.tearDown(first); 
    } 

} 

@Service 
public class FirstService { 
    // logic 
} 
+0

Stellen Sie sicher, Service Auto-Verkabelung hat kommentierten mit sind ** Sterio-Typ-Anmerkung ** –

+0

All Dienste verwenden 'org.springframework.stereotype.Service' Annotation. –

Antwort

3

Für den Anfang Ihrer Testklasse AbstractTestExecutionListener implementieren zu müssen, ist keine gute Idee. A TestExecutionListener sollte in einer eigenständigen Klasse implementiert werden. Vielleicht möchten Sie diesen Ansatz überdenken.

In jedem Fall ist Ihre aktuelle Konfiguration fehlerhaft: Sie haben alle Standardimplementierungen TestExecutionListener deaktiviert.

Um die Standardeinstellungen zu übernehmen, versuchen Sie stattdessen die folgende Konfiguration.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = ProjectConfig.class) 
@TestExecutionListeners(listeners = TestClass.class, mergeMode = MERGE_WITH_DEFAULTS) 
public class TestClass extends AbstractTestExecutionListener { 
    // ... 
} 

Grüße,

Sam (Autor des Frühlings Testcontext Rahmen)

+0

Ich überlege, 'AbstractTestExecutionListener' in eine eigenständige Klasse zu verschieben. Ich weiß jedoch nicht, wie man auf die Objekte, die in jeder Phase ('beforeTestClass' und' beforeTestMethod') erstellt wurden, in der Laufzeit jedes '@Test' von' TestClass' zugreift, ohne in irgendeiner Datenbank zu bleiben. –

+0

Diese Antwort wurde nur gelöst 'null' von' @ Autowired' globalen Variablen. Die globalen Variablen, die während 'beforeTestClass' und' beforeTestMethod' initialisiert wurden, werden nach '@Test'-Methode immernoch als 'null'bewertet. –