SpringBoot 2 + Junit5:@Value为空

时间:2018-10-21 19:57:05

标签: spring-boot junit junit5 spring-boot-test

我有一个带有SpringBoot2和Junit5的应用程序,现在我正在尝试进行测试。 我有一个名为OrderService的此类,如下所示:

@Component
public class OrderService {
@Value("#{'${food.requires.box}'.split(',')}")
private List<String> foodRequiresBox;

@Value("#{'${properties.prioritization}'.split(',')}")
private List<String> prioritizationProperties;

@Value("${further.distance}")
private Integer slotMeterRange;

@Value("${slot.meters.long}")
private Double slotMetersLong;

如您所见,该类具有许多@Value注释,它们从application.properties文件中提取值。

在POM文件中,我具有以下依赖性:

  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
    <dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <version>1.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <version>2.0.5.RELEASE</version>
    </dependency>

test / resources 文件夹中,我具有包含以下信息的application.properties文件:

properties.prioritization:vip,food
food.requires.box:pizza,cake,flamingo
further.distance:2
slot.meters.long:0.5

测试文件如下:

@ExtendWith(SpringExtension.class)
@TestPropertySource(locations="classpath:application.properties")
public class OrderServiceTest {

    OrderService orderService;

    @BeforeEach
    void before(){
        orderService = new OrderService();
    }

    @Test
    void findAll() {
        Order order = new Order().withDescription("2x Pizza with Salad\\n2x Kebab with Fries\\n1x Hot dog with Fries\\n2x Pizza with Fries");
        assertTrue(orderService.orderHasFood.test(order));
    }
}

但是,当测试尝试使用 foodRequiresBox 时,该测试将引发NullPointerException,因此读取application.properties文件会出现问题。

您能告诉我如何读取测试的application.properties文件吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

第一个解决方案

我建议使用Spring的内部注解@SpringJUnitConfig 此批注实际上与@ExtendWith(SpringExtension.class) 相同,您可以使用与使用@ContextConfiguration相同的方式为测试配置spring应用程序上下文。

或者,如果您想进行完整的Spring Boot测试,则可以结合使用:

@SpringJUnitConfig
@SpringBootTest
public class OrderServiceTest {
...
}

第二个解决方案

另一种方法是根本不使用Spring,而是使用例如模拟所有内部内容。 Mockito并编写一个简单的简单单元测试。 然后,您可以通过@Value通过Spring注入注解的org.springframework.test.util.ReflectionTestUtils字段来正常设置。