SpringBoot 2 +六月五日:带@Value的空值

ttcibm8c  于 2022-12-23  发布在  Spring
关注(0)|答案(2)|浏览(152)

我有一个SpringBoot 2和Junit 5的应用程序,现在我试着做一个测试,我有一个叫做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注解,这些注解从www.example.com文件中提取值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包含以下信息的www.example.com文件:

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,因此读取www.example.com文件时出现了问题application.properties。
你能告诉我如何读取application.properties文件进行测试吗?

mkh04yzy

mkh04yzy1#

第一种溶液

我建议使用Spring的内部注解@SpringJUnitConfig。这个注解实际上与@ExtendWith(SpringExtension.class)相同,但是您可以使用与使用@ContextConfiguration相同的方法为测试配置Spring应用程序上下文。
或者,如果您想要进行完整的Spring Boot 测试,您可以合并:

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

第二种溶液

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

ctrmrzij

ctrmrzij2#

我建议使用setField()方法(如@mrkernelpanic第二个解决方案中所示),以避免初始化整个Spring上下文。
下面是一个片段:

// ReflexionTestUtils.setField(targetObject, "targetFieldName", valueToInject);
ReflexionTestUtils.setField(orderService, "foodRequiresBox", "pizza,cake,flamingo");

相关问题