JMH Benchmark在Spring(with maven)项目中使用Autowired字段获取NullPointerException

时间:2017-05-04 09:14:40

标签: spring maven benchmarking microbenchmark jmh

我尝试对我的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?

1 个答案:

答案 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);