2017-02-13 1 views
5

Comment utiliser l'injection de dépendances Spring dans une classe TestExecutionListener que j'ai écrite en développant AbstractTestExecutionListener? Spring DI ne semble pas fonctionner avec les classes TestExecutionListener.L'injection de dépendances de printemps dans Spring TestExecutionListeners ne fonctionne pas

Exemple de question:

Le AbstractTestExecutionListener:

class SimpleClassTestListener extends AbstractTestExecutionListener { 

    @Autowired 
    protected String simplefield; // does not work simplefield = null 

    @Override 
    public void beforeTestClass(TestContext testContext) throws Exception { 
     System.out.println("simplefield " + simplefield); 
    } 
} 

fichier de configuration:

@Configuration 
@ComponentScan(basePackages = { "com.example*" }) 
class SimpleConfig { 

    @Bean 
    public String simpleField() { 
     return "simpleField"; 
    } 

} 

Le fichier de test JUnit:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = { SimpleConfig.class }) 
@TestExecutionListeners(mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS, listeners = { 
    SimpleClassTestListener.class }) 
public class SimpleTest { 

    @Test 
    public void test(){ 
     assertTrue(); 
    } 
} 

Comme l'a souligné dans le commentaire de code, quand je lancez ceci, il affichera "simplefield null" car simplefield ne g ets injectés avec une valeur.

+0

J'ai également ajouté @ComponentScan (basePackages = {"com.example *"}) dans la configuration. –

+0

Je n'aime pas utiliser testContext.getApplicationContext(). GetBean (...). –

+0

Je vois ce problème aussi dans un nouveau projet avec Spring Boot 1.5.2.RELEASE. –

Répondre

2

Ajoutez simplement autowiring pour l'ensemble TestExecutionListener.

@Override 
public void beforeTestClass(TestContext testContext) throws Exception { 
    testContext.getApplicationContext() 
      .getAutowireCapableBeanFactory() 
      .autowireBean(this); 
    // your code that uses autowired fields 
} 

Vérifiez sample project in github.