[java] 在單元測試期間填充Spring @Value


Answers

自Spring 4.1以來,您可以通過在單元測試級別上使用org.springframework.test.context.TestPropertySource註釋來在代碼中設置屬性值。 甚至可以使用這種方法將屬性注入到依賴bean實例中

例如

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = FooTest.Config.class)
@TestPropertySource(properties = {
    "some.bar.value=testValue",
})
public class FooTest {

  @Value("${some.bar.value}")
  String bar;

  @Test
  public void testValueSetup() {
    assertEquals("testValue", bar);
  }


  @Configuration
  static class Config {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertiesResolver() {
        return new PropertySourcesPlaceholderConfigurer();
    }

  }

}

注意:在Spring上下文中必須有org.springframework.context.support.PropertySourcesPlaceholderConfigurer實例

編輯24-08-2017:如果您使用的是SpringBoot 1.4.0及更高版本,則可以使用@SpringBootTest@SpringBootConfiguration註釋初始化測試。 更多信息here

在SpringBoot的情況下,我們有以下代碼

@SpringBootTest
@SpringBootConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = {
    "some.bar.value=testValue",
})
public class FooTest {

  @Value("${some.bar.value}")
  String bar;

  @Test
  public void testValueSetup() {
    assertEquals("testValue", bar);
  }

}
Question

我正在為我的程序中使用的一個簡單的bean編寫單元測試來驗證表單。 該bean使用@Component註釋,並具有使用@Value("${this.property.value}") private String thisProperty;初始化的類變量@Value("${this.property.value}") private String thisProperty;

我想為這個類中的驗證方法編寫單元測試,但是,如果可能的話,我想這樣做而不使用屬性文件。 我的理由是,如果我從屬性文件中提取的值發生更改,我希望不會影響我的測試用例。 我的測試用例正在測試驗證值的代碼,而不是值本身。

有沒有一種方法可以在我的測試類中使用Java代碼來初始化一個Java類並填充該類中的Spring @Value屬性,然後使用它來測試?

我確實發現這個如何似乎很接近,但仍然使用屬性文件。 我寧願它都是Java代碼。

謝謝




這似乎工作,雖然仍然有點冗長(我想更短的東西仍然):

@BeforeClass
public static void beforeClass() {
    System.setProperty("some.property", "<value>");
}

// Optionally:
@AfterClass
public static void afterClass() {
    System.clearProperty("some.property");
}



Related