programing

@ConfigurationProperties 및 @Autowired 클래스를 테스트하는 방법

magicmemo 2023. 3. 17. 20:32
반응형

@ConfigurationProperties 및 @Autowired 클래스를 테스트하는 방법

로딩된 속성에 의존하는 애플리케이션의 작은 부분을 테스트하고 싶다.@Autowired그리고.@ConfigurationProperties필요한 속성만 로드하고 항상 전체는 로드하지 않는 솔루션을 찾고 있습니다.ApplicationContext. 다음은 축소된 예입니다.

@TestPropertySource(locations = "/SettingsTest.properties")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestSettings.class, TestConfiguration.class})
public class SettingsTest {
    @Autowired
    TestConfiguration config;

    @Test
    public void testConfig(){
        Assert.assertEquals("TEST_PROPERTY", config.settings().getProperty());
    }
}

구성 클래스:

public class TestConfiguration {
    @Bean
    @ConfigurationProperties(prefix = "test")
    public TestSettings settings (){
        return new TestSettings();
    }
}

설정 클래스:

public class TestSettings {
    private String property;

    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }
}

리소스 폴더의 속성 파일에는 다음 항목이 포함되어 있습니다.

test.property=TEST_PROPERTY

현재 설정에서는 null이 아니지만 사용할 수 있는 필드가 없습니다.필드가 필드가 아닌 이유는 Springboot가 아닌 Spring을 사용하고 있다는 사실과 관련이 있을 것입니다.그렇다면 Springboot을 실행하는 방법은 무엇일까요?

edit: 이 작업을 수행하는 이유는 다음과 같습니다.텍스트 파일을 구문 분석하는 파서가 있습니다. 사용되는 정규 표현식은 속성 파일에 저장됩니다.이를 테스트하기 위해 TestSettings 위의 exaple에 있는 이 파서에 필요한 속성만 로드하고 싶습니다.

코멘트를 읽고 있을 때, 이것은 더 이상 유닛 테스트가 아니라는 것을 깨달았습니다.단, 이 작은 테스트에 완전한 스프링부트 구성을 사용하는 것은 무리인 것 같습니다.그래서 속성을 가진 하나의 클래스만 로드할 수 있는 포지시빌티가 있는지 물어본 것입니다.

TestConfiguration에 주석을 달아야 합니다.@EnableConfigurationProperties다음과 같습니다.

@EnableConfigurationProperties
public class TestConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "test")
    public TestSettings settings (){
        return new TestSettings();
    }
}

또한 다음 항목만 포함하면 됩니다.TestConfiguration.class@ContextConfiguration당신의SettingsTest클래스:

@TestPropertySource(locations = "/SettingsTest.properties")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfiguration.class)
public class SettingsTest {
...

몇 가지 포인트:

  1. 기본 패키지에 "Test Configuration" 클래스가 필요하지 않습니다. "Test Settings" 빈만 구성하기 때문입니다.TestSettings 클래스 자체에 주석을 달기만 하면 됩니다.

  2. 일반적으로 @Spring Application Configuration 주석을 사용하여 테스트에 필요한 컨텍스트를 로드하고 응용 프로그램클래스의 이름을 전달합니다.단, Application Context 전체를 로드하고 싶지 않다고 하셨기 때문에(이유는 명확하지 않지만) 테스트용으로만 로드하기 위해 특별한 구성 클래스를 생성해야 합니다.아래에서는 원래 가지고 있던 Test Configuration 클래스와의 혼동을 피하기 위해 "Test Configuration New"라고 부릅니다.

  3. Spring Boot 월드에서는 일반적으로 모든 속성은 "application.properties" 파일에 보관되지만 다른 곳에 저장할 수도 있습니다.아래에 제안하신 "SettingsTest.properties" 파일을 지정하였습니다.이 파일의 복사본은 메인/리소스 폴더에 있는 복사본과 테스트/리소스 폴더에 있는 복사본 두 개입니다.

다음과 같이 코드를 변경합니다.

TestSettings.java(메인 패키지)

@Configuration
@ConfigurationProperties(prefix="test", locations = "classpath:SettingsTest.properties")
public class TestSettings {

    private String property;

    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }
}

SettingsTest.java(테스트 패키지 내)

@TestPropertySource(locations="classpath:SettingsTest.properties")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestConfigurationNew.class)
public class SettingsTest {

    @Autowired
    TestSettings settings;

    @Test
    public void testConfig(){
        Assert.assertEquals("TEST_PROPERTY", settings.getProperty());
    }
}

Test Configuration New.java(테스트 패키지 내):

@EnableAutoConfiguration
@ComponentScan(basePackages = { "my.package.main" })
@Configuration
public class TestConfigurationNew {
}

이제 원하는 대로 작동해야 합니다.

@SpringBoot" @EnableConfigurationProperties" 에 @EnableConfigurationProperties 를할 수 .접접테테 테다다다다다
::

@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestConfiguration.class)
@EnableConfigurationProperties
...

Spring Boot를 사용하는 경우 필요한 것은 다음과 같습니다.

@RunWith(SpringRunner.class)
@SpringBootTest

없음 ★★★★★@ContextConfiguration합니다.EnableAutoConfiguration ★★★★★★★★★★★★★★★★★」EnableConfigurationProperties로딩할 컨피규레이션클래스를 지정할 필요는 없습니다.모두 로딩됩니다.

, 읽을 속성 엔트리를 확인합니다.main/resources/application.yml라는 내용도 .test/resources/application.yml반복은 피할 수 없다.


또 다른 방법은 다음과 같습니다.

  1. 합니다. 설정 클래스는 테스트용으로만 합니다.MyApplicationTest.java , , , , , , , , , , , , , , .이 클래스는 비워 둘 수 있습니다.

예를 들어 다음과 같습니다.

@EnableAutoConfiguration
@EnableConfigurationProperties(value = {
        ConnectionPoolConfig.class
})
public class MyApplicationTestConfiguration {
}
  1. 또한 자동 전원 구성을 로드하는 클래스입니다.

예를 들어 다음과 같습니다.

@RunWith(SpringRunner.class)
//@SpringBootTest // the first, easy way
@ContextConfiguration(classes = MyApplicationTestConfiguration.class,
        initializers = ConfigFileApplicationContextInitializer.class)
public class ConnectionPoolConfigTest {

    @Autowired
    private ConnectionPoolConfig config;

기본적으로는 다음과 같습니다.

  • @EnableConfigurationProperties ★★★★★★★★★★★★★★★★★」@EnableAutoConfiguration ( 「 」 )의 일람을 합니다.@ConfigurationProperties하고 파일
  • 에서는 이하여 Spring을 로드합니다.application.ymlfilename을 클릭합니다.

을 '로딩하다'에 넣으세요.test/resources/application.yml반복은 피할 수 없다.파일을 해야 할 를 합니다.@TestProperties()위치를 지정합니다.주의:@TestProperties는 「」만을 서포트합니다..propertiesfiles.complete files files files files files files files files.


양쪽 모두 구성 클래스 로드 값에서 작동합니다.

  • application.yml/application.properties
  • ' 속성 파일됩니다.PropertySource,맘에 들다@PropertySource(value = "classpath:threadpool.properties")

중요한

Spring doc의 마지막 메모는 다음과 같습니다.

Project Lombok을 사용하여 자동으로 getter와 setter를 추가하는 사람도 있습니다.Lombok은 컨테이너가 객체를 인스턴스화하기 위해 자동으로 사용되므로 이러한 유형의 특정 생성자를 생성하지 않아야 합니다.

마지막으로 표준 Java Bean 속성만 고려되며 정적 속성에 대한 바인딩은 지원되지 않습니다.

그말이 약 that that that that that가 있는 경우lombok.@Builder nor가 없으면 속성 주입은 실행되지 않습니다. 왜냐하면 그것은 에 의해 생성된 보이지 않는 컨스트럭터만 보기 때문입니다.@Builder따라서 이 주석들은 모두 사용하지 마십시오.

유닛 테스트

콘텍스트를 스프링 를 사용할 수 있습니다.Binder어쨌든 스프링이 내부적으로 사용하는 클래스입니다.

// A map of my properties.
Map<String, String> properties = new HashMap<>();
properties.put("my-prefix.first-property", "foo");
properties.put("my-prefix.second-property", "bar");

// Creates a source backed by my map, you can chose another type of source as needed.
ConfigurationPropertySource source = new MapConfigurationPropertySource(properties)

// Binds my properties to a class that maps them.
Binder binder = new Binder(source);
BindResult<MyConfiguration> result = binder.bind("my-prefix", MyConfiguration.class);

// Should return true if bound successfully.
Assertions.assertTrue(result.isBound);

// Asserts configuration values.
MyConfiguration config = result.get();
Assertions.assertEquals("foo", config.getFirstProperty());
Assertions.assertEquals("bar", config.getSecondProperty());

언급URL : https://stackoverflow.com/questions/31745168/how-to-test-classes-with-configurationproperties-and-autowired

반응형