我尝试对我的Spring(with maven)项目的一些方法进行基准测试。我需要在项目的几个字段中使用@Autowired和@Inject。当我运行我的项目时,它运作良好。但是JMH总是使用@Autowired / @Inject字段获取NullPointerException。
public class Resources {
private List<Migratable> resources;
@Autowired
public void setResources(List<Migratable> migratables) {
this.resources = migratables;
}
public Collection<Migratable> getResources() {
return resources;
}
}
我的基准课程
@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());
}
}
当我运行基准测试时,它会在Resources.getResources()
处获得NullPointerException
更具体地说,在resources
。
它不能自动装配setResources()。但是,如果我运行我的项目(排除基准),它工作正常。
如何在基准测试时使用Autowired字段消除此NullPointerException?
答案 0 :(得分:-1)
尝试使用
测试课上的 @RunWith(SpringJUnit4ClassRunner.class) and @ContextConfiguration(locations = {...})
。这应该初始化Spring TestContext Framework并让你自动装配依赖关系。
如果这不起作用,那么你必须使用
中的任何一个明确地启动Spring ApplicationContext作为 @Setup 注释方法的一部分ClassPathXmlApplicationContext,FileSystemXmlApplicationContext或 WebXmlApplicationContext并从该上下文中解析bean:
ApplicationContext context = new ChosenApplicationContext("path_to_your_context_location");
res = context.getBean(Resources.class);