Spring Boot 2 + Junit 5:带有@Value 的空值

Posted

技术标签:

【中文标题】Spring Boot 2 + Junit 5:带有@Value 的空值【英文标题】:SpringBoot 2 + Junit5: null with @Value 【发布时间】:2019-03-25 22:26:57 【问题描述】:

我有一个带有 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;

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

在 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 文件吗?

【问题讨论】:

如果您需要属性文件中的值,您需要在测试中运行 spring 上下文。如果你不想启动上下文,你应该使用 mockito 和 .when 【参考方案1】:

第一种解决方案

我建议使用 Spring 的内部注释 @SpringJUnitConfig 此注解实际上与@ExtendWith(SpringExtension.class) 相同但是您可以像以前使用@ContextConfiguration 一样为您的测试配置Spring 应用程序上下文。

或者如果你想要一个完整的 Spring Boot 测试,你可以结合:

@SpringJUnitConfig
@SpringBootTest
public class OrderServiceTest 
...

第二个解决方案

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

【讨论】:

我更喜欢第二种解决方案而不是第一种解决方案,因为初始化 spring 上下文的开销较小

以上是关于Spring Boot 2 + Junit 5:带有@Value 的空值的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2 + Junit 5:带有@Value 的空值

@MockBean 不适用于带有 JUnit 5 和 Spring Boot 2 的 @WebMvcTest?

在 JUnit 5 测试中模拟 Spring Boot 2 应用程序的自动装配依赖项

Junit / Spring Boot 模拟类

Maven 依赖于 Spring Boot 和 Junit

Gradle 5 JUnit BOM 和 Spring Boot 版本不正确