Java 如何为实现ApplicationListener的类编写JUNIT测试用例<;应用准备事件>;

Java 如何为实现ApplicationListener的类编写JUNIT测试用例<;应用准备事件>;,java,spring,spring-boot,junit,Java,Spring,Spring Boot,Junit,这是我在Spring引导应用程序中的类。我正在尝试为该方法编写JUNIT测试用例 onApplicationEvent public class MyUtil implements ApplicationListener<ApplicationPreparedEvent> { @Override public void onApplicationEvent(ApplicationPreparedEvent applicationPreparedEvent) {

这是我在Spring引导应用程序中的类。我正在尝试为该方法编写JUNIT测试用例 onApplicationEvent

public class MyUtil implements ApplicationListener<ApplicationPreparedEvent>
{
    @Override
    public void onApplicationEvent(ApplicationPreparedEvent applicationPreparedEvent)
    {
        ConfigurableEnvironment configurableEnvironment = applicationPreparedEvent.getApplicationContext()
                .getEnvironment();
        String vaultSecretId = configurableEnvironment.getProperty("vault.secret.id");
        String vaultRoleId = configurableEnvironment.getProperty("vault.role.id");

        //Make REST call and fetch key value pair and set vaule in property.

        for (Map.Entry<String, String> entry : allSecrets.entrySet())
        {
            System.setProperty(entry.getKey(), entry.getValue());
        }
    }
}

我可以通过添加StaticApplicationContext使其工作。也许有更好的办法。如果有更好的方法为这个场景编写测试用例,请告诉我

@Test
public void testSuccess()
{
    MockEnvironment mockEnvironment = new MockEnvironment();
    mockEnvironment.setProperty("vault.secret.id", "somesecretid");
    mockEnvironment.setProperty("vault.role.id", "someroleid");
    SpringApplication application = new SpringApplication();
    String[] args = new String[1];
    StaticApplicationContext staticApplicationContext = new StaticApplicationContext();
    staticApplicationContext.setEnvironment(mockEnvironment);
    ApplicationPreparedEvent event = new ApplicationPreparedEvent(application, args, staticApplicationContext);
    MyUtil myUtil = new MyUtil();
    myUtil.onApplicationEvent(event);
}

我建议利用Spring的测试特性,不需要模拟

注意:此示例使用Junit Jupiter


导入org.junit.jupiter.api.Test;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.boot.SpringApplication;
导入org.springframework.boot.context.event.ApplicationPreparedEvent;
导入org.springframework.context.ApplicationListener;
导入org.springframework.context.ConfigurableApplicationContext;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.core.env.ConfigurableEnvironment;
导入org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
@春刺柏配置
公共类Q62049482{
@自动连线
ConfigurableApplicationContext ConfigurableApplicationContext;
@试验
public void testSuccess(){
var ape=new ApplicationPreparedEvent(new SpringApplication(),null,this.configurableApplicationContext);
var myUtil=new myUtil();
myUtil.onApplicationEvent(ape);
//在此处添加断言
}
公共静态类MyUtil实现ApplicationListener{
@凌驾
ApplicationEvent(ApplicationPreparedEvent ApplicationPreparedEvent)上的公共无效{
ConfigurableEnvironment ConfigurableEnvironment=ApplicationPrepareEvent.getApplicationContext()
.getEnvironment();
字符串vaultSecretId=configurableEnvironment.getProperty(“vault.secret.id”);
字符串vaultRoleId=configurableEnvironment.getProperty(“vault.role.id”);
//
////进行REST调用并获取键值对,并在属性中设置值。
//
//for(Map.Entry:allSecrets.entrySet())
// {
//set属性(entry.getKey(),entry.getValue());
// }
}
}
}

你试过mockito吗?谢谢@Jeff。它正在按预期工作。静态类Config{}的用途是什么。没有这一点,这是可行的。我更喜欢Mock,因为我可以覆盖配置。i、 e.我想动态更改我的REST URL端口。mockEnvironment.setProperty(vault.base.url,String.format(“,mockWebServer.getPort());我正在使用okhttp3.mockwebserver来模拟API调用。如果使用Spring测试特性,则无法覆盖测试用例中的属性。我将被迫在某个端口启动MockWebServer。哎哟,在重构之后忘记删除Config类了。
@Test
public void testSuccess()
{
    MockEnvironment mockEnvironment = new MockEnvironment();
    mockEnvironment.setProperty("vault.secret.id", "somesecretid");
    mockEnvironment.setProperty("vault.role.id", "someroleid");
    SpringApplication application = new SpringApplication();
    String[] args = new String[1];
    StaticApplicationContext staticApplicationContext = new StaticApplicationContext();
    staticApplicationContext.setEnvironment(mockEnvironment);
    ApplicationPreparedEvent event = new ApplicationPreparedEvent(application, args, staticApplicationContext);
    MyUtil myUtil = new MyUtil();
    myUtil.onApplicationEvent(event);
}