@Value未通过 Java 配置的测试上下文进行设置

2022-09-03 00:22:55

我有一个使用Java配置的Spring(等)的Maven项目。引用的属性存储在不同的地方,例如Tomcat的上下文.xml。@Configuration@Value

为了进行测试,我创建了一个 .properties 文件,为组件和服务提供一些值。在我的 JUnit 测试(使用弹簧测试上下文)中,此 .properties 文件是通过 添加的。问题是值不会从文件中加载,而是将值标识符设置为值,例如 (所以我得到了除String以外的任何一个的ClassCastExceptions)。此外,不会设置默认值,因此我认为,根本不会处理这些值。@PropertySource${someFlag:false}

我确信Spring找到了这个文件,因为当我更改的值时,我得到了一些FileNotFoundException。尽管如此,我已经尝试了不同的变体来指向这个文件,所有这些都已经工作了(通过重命名来测试,它产生了FileNotFoundException):@PropertySource

  • 类路径:/test.properties(我的首选表示法)
  • /test.properties
  • file:src/test/resources/test.properties

我也确信Spring本身是有效的,因为当我删除时,所测试的类会按预期在我的测试中注入。@Value@Autowired

在下面,您会发现问题场景尽可能地精简。有关版本和依赖项,请参阅底部的 pom.xml。

我的服务.java

package my.package.service;

// Imports

@Service
public class MyService {

    @Value("${someFlag:false}")
    private Boolean someFlag;

    public boolean hasFlag() {
        return BooleanUtils.isTrue(someFlag);
    }
}

我的配置.java

@Configuration
@ComponentScan(basePackages = {"my.package.service"})
public class MyConfiguration {
}

我的服务组件测试.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {MyTestConfiguration.class})
public class MyServiceComponentTest {

    @Autowired
    private MyService service;

    @Test
    public void hasFlagReturnsTrue() {
        assertThat(service.hasFlag(), is(true));
    }
}

MyTestConfiguration.java

@Configuration
@Import({MyConfiguration.class})
@PropertySource("classpath:/test.properties")
public class MyTestConfiguration {
}

src/test/resources/test.properties

someFlag=true

啪.xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.version>3.2.3.RELEASE</spring.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- Test dependencies -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-library</artifactId>
        <version>1.3</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
</dependencies>

答案 1

这里的问题是,你还需要一个实际负责解析字段的bean,只需添加另一个bean来创建这个bean:PropertySourcesPlaceholderConfigurer${..}

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

答案 2

在Spring 4中,现在可以使用TestPropertySource

@TestPropertySource(value="classpath:/config/test.properties")

为了加载特定属性以进行 junit 测试