Как написать тестовый пример JUNIT для класса, реализующего ApplicationListener <ApplicationPreparedEvent> - PullRequest
0 голосов
/ 27 мая 2020

Это мой класс в приложении загрузки 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());
        }
    }
}

My JUNIT Test case

Когда я запускаю тестовый пример ниже. Я получаю null для configurableEnvironment в классе MyUtil

@Test
public void testSuccess()
{
    MyUtil myUtil = new MyUtil();
    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];
    ConfigurableApplicationContext context = mock(ConfigurableApplicationContext.class);
    context.setEnvironment(mockEnvironment);
    ApplicationPreparedEvent event = new ApplicationPreparedEvent(application, args, context);
    // event.getApplicationContext().setEnvironment(mockEnvironment);  - Tried this but no luck
    myUtil.onApplicationEvent(event);
}

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Я бы посоветовал использовать тестовые возможности Spring, никаких имоков не требуется.

Примечание: в этом примере используется Junit Jupiter


import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.context.event.ApplicationPreparedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

@SpringJUnitConfig
public class Q62049482 {

    @Autowired
    ConfigurableApplicationContext configurableApplicationContext;


    @Test
    public void testSuccess() {
        var ape = new ApplicationPreparedEvent(new SpringApplication(), null, this.configurableApplicationContext);
        var myUtil = new MyUtil();
        myUtil.onApplicationEvent(ape);
        // add assertions here
    }

    public static 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());
            // }

        }
    }
}

0 голосов
/ 27 мая 2020

Мне удалось заставить его работать, добавив 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);
}
...