2017-10-13 7 views
1

Cela pourrait avoir été codé à tort, mais aucune idée de la façon dont il devrait être fait est appréciée.NPE sur autowires de printemps formulaire TestExecutionListener


J'ai cette classe TestClass qui a besoin d'injecter beaucoup de classe de service. Puisque je ne peux pas utiliser @BeforeClass sur @Autowired objets, j'utilise AbstractTestExecutionListener. Tout fonctionnait comme prévu mais quand je suis sur @Test blocs, tous les objets sont évalués null.

Une idée de comment résoudre ce problème?

@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

Assurez-vous, les services que vous auto-câblage n'annotée avec ** Sterio-type annotation ** Tous –

+0

les services utilisent l'annotation 'org.springframework.stereotype.Service'. –

Répondre

3

Pour commencer, il est déconseillé d'avoir implémenté la classe de test AbstractTestExecutionListener. Un TestExecutionListener doit être implémenté dans une classe autonome. Vous pourriez donc vouloir repenser cette approche.

Dans tous les cas, votre configuration actuelle est cassée: vous avez désactivé toutes les implémentations TestExecutionListener par défaut.

Pour inclure les valeurs par défaut, essayez plutôt la configuration suivante.

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

Cordialement,

Sam (auteur du Cadre TestContext printemps)

+0

Je envisage de déplacer 'AbstractTestExecutionListener' vers une/des classe (s) autonome (s). Cependant, je ne sais pas comment accéder aux objets créés sur chaque phase ('beforeTestClass' et' beforeTestMethod') dans l'exécution de chaque '@ Test' de' TestClass' sans persister dans aucune base de données –

+0

Cette réponse seulement résolu 'null' des variables globales' @ Autowired'. Les variables globales initialisées pendant 'beforeTestClass' et' beforeTestMethod' sont toujours évaluées 'null' sous la méthode' @ Test'. –