2017-05-04 1 views
0

J'essaie de tester certaines des méthodes de mon projet Spring (with maven). J'ai besoin d'utiliser @Autowired et @Inject sur plusieurs champs de mon projet. Pendant que je dirige mon projet, ça fonctionne bien. Mais JMH obtient toujours NullPointerException avec les champs @ Autowired/@ Inject.JMH Benchmark obtient NullPointerException avec champ Autowired dans le projet Spring (avec maven)

public class Resources { 

    private List<Migratable> resources; 

    @Autowired 
    public void setResources(List<Migratable> migratables) { 
     this.resources = migratables; 
    } 

    public Collection<Migratable> getResources() { 
     return resources; 
    } 
} 

Ma classe de référence

@State(Scope.Thread) 
public class MyBenchmark { 

    @State(Scope.Thread) 
    public static class BenchmarkState { 

     Resources res; 

     @Setup 
     public void prepare() { 
      res = new Resources(); 
     } 
    } 

    @Benchmark 
    public void testBenchmark(BenchmarkState state, Blackhole blackhole) { 
     blackhole.consume(state.res.getResources()); 
    } 
} 

Quand je lance mon indice de référence, il se NullPointerException à Resources.getResources() Plus précisément à resources.
Il ne peut pas autowire setResources(). Mais si je cours mon projet (exclure le benchmark), ça fonctionne bien.
Comment puis-je me débarrasser de ce champ NullPointerException avec Autowired lors de l'analyse comparative?

Répondre

0

Essayez d'utiliser

@RunWith(SpringJUnit4ClassRunner.class) and @ContextConfiguration(locations = {...}) sur la classe de test. Ceci devrait initialiser Spring TestContext Framework et vous permettre d'autowire les dépendances.

Si cela ne fonctionne pas, alors vous devez commencer Spring ApplicationContext explicitement comme une partie de vous @Setup méthode annotée, en utilisant l'une des

ClassPathXmlApplicationContext, FileSystemXmlApplicationContext ou WebXmlApplicationContext et résoudre les haricots de ce contexte:

ApplicationContext context = new ChosenApplicationContext("path_to_your_context_location"); 
res = context.getBean(Resources.class);