当前位置: 首页 > 知识库问答 >
问题:

在基准测试中通过注释加载应用程序上下文

赵越
2023-03-14

假设我想为类编写一个基准测试,它可以是autowired,因此我需要加载application context

我的测试有注释@org.openjdk.jmh.annotations.state(Scope.benchmark)和main方法

public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(MyBenchmark.class.getSimpleName())
                .forks(1)
                .build();

        new Runner(opt).run();
    }

当然,我有这样一些基准:

@Benchmark
public void countAllObjects() {
    Assert.assertEquals(OBJECT_COUNT, myAutowiredService.count());
}

现在的问题是如何注入MyAutowiredService

可能的解决办法

ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/application-context.xml");
context.getAutowireCapableBeanFactory().autowireBean(this);
@ContextConfiguration(locations = { "classpath:META-INF/application-context.xml" })
@Autowired
private MyAutowiredService myAutowiredService;
@RunWith(SpringJUnit4ClassRunner.class)

共有1个答案

阎嘉荣
2023-03-14

我从spring-cloud-sleuth找到了代码,它对我有用

@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
public class DemoApplicationTests {

    volatile DemoApplication app;

    volatile ConfigurableApplicationContext context;

    private VideoService videoService;

    @Test
    public void contextLoads() throws RunnerException {
        Options opt = new OptionsBuilder()
            .include(DemoApplicationTests.class.getSimpleName())
            .forks(1)
            .build();
        new Runner(opt).run();
    }

    @Setup
    public void setup() {
        this.context = new SpringApplication(DemoApplication.class).run();
        Object o = this.context.getBean(VideoService.class);
        videoService = (VideoService)o;
    }

    @TearDown
    public void tearDown(){
        this.context.close();
    }

    @Benchmark
    public String benchmark(){
        return videoService.find("z");
    }
 类似资料:
  • 我是spring的新手,我想知道是否可以只通过注释必须注入变量的类来加载应用程序(而不是使用ApplicationContext ctx=new ApplicationContext(“MyAppContext”))。 我举以下例子: 我有一个类,其中一个字符串应该是自动连线的 spring bean配置文件(testSpringContext.xml)如下所示 现在,我想使用中的以下代码显示自动

  • 我在我的src/test/resources路径中创建了一个application-integrationtest.yaml,所以我的测试是针对创建的docker TestContainer运行的。问题是没有加载我的application-integrationtest.yaml。 我正在运行一个SpringBoot2.x应用程序 原因:org.springframework.beans.Bean

  • 我得到的错误是: 我试图更改上下文配置的位置,如下所示:

  • 我在Spring Framework上运行了几个集成测试,它们扩展了名为BaseitCase的基类。 ,如下所示: 问题是其中一个测试有几个声明:@mockbean,在执行这个测试的那一刻,Spring会重新创建上下文,随后的测试有时会使用错误的bean(来自为使用@mockbean的测试创建的上下文)。我通过检查bean有不同的hashcode就知道了这一点。 当我使用@EventListene

  • 问题内容: 我有一个包含2个测试的测试类: 当我单独运行测试时,我不会出错,但是当我同时运行所有测试时,会失败。失败是由于某些测试修改了应用程序上下文导致的: 是否可以单独运行此测试?我只想在启动test1时读取所有必需的东西,然后运行测试,然后关闭所有必需的东西。然后启动test2。 问题答案: 您可以在修改应用程序上下文的测试类上使用@DirtiesContext批注。 Java文档 Spri

  • 嗨,我正试图让spring junit测试用例...我要求加载完整的应用程序上下文。但是,junit测试不会初始化完整的应用程序上下文。 因此,它应该扫描com.test包中的所有spring bean,并将它们加载到Junit TestCase的applicationcontext中。但从大豆的产量来看,它似乎没有做到这一点。