使用模拟测试时无法注入application.properties中定义的@value

时间:2019-01-11 17:02:42

标签: java spring-boot mockito

进行模拟测试时,如何注入application.properties中定义的值。

Service.java

@Override
public String getUseLanguage() {
    return applicationProperties.getLanguage();
}

ApplicationProperties.java

public class ApplicationProperties {

    @Value("${language}")
    private String Language;

    public String getLanguage() {
        return Language;
    }

application.properties

Language = EN;

我的测试用例:

@RunWith(MockitoJUnitRunner.class)
public class TimChannelServiceTest {
@Mock
private ApplicationProperties applicationProperties;

@InjectMocks
private Service Service;

@Test
public void getUseLanguage(){
    assertEquals(applicationProperties.getLanguage(),Service.getUseLanguage());
    }
}

@Value 似乎没有注入ApplicationProperties, applicationProperties.getLanguage() Service.getUseLanguage()均为空。

谁能告诉我如何处理这个问题

3 个答案:

答案 0 :(得分:1)

如果您要谈论spring @Value,则必须使用带有@RunWith(SpringJUnit4ClassRunner.class)批注以及将注入应用程序属性类的上下文文件来运行测试用例。

    @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:test-context.xml")
public class MyTest {
    }

但是,在这种情况下,您在嘲笑,因此您不能指望它提供spring实用程序。

答案 1 :(得分:1)

您在测试中嘲笑了applicationProperties字段,但没有提供任何行为。这就意味着在返回null上调用的方法。
此外,如果要按预期方式注入属性,为什么还要嘲笑?

要测试application.properties的值,请用@SpringBootTest注释类,这将加载Spring上下文,并以此方式加载环境属性。

答案 2 :(得分:1)

您需要加载spring上下文,@value才能正常工作。用@SpringBootTest注释您的班级。另外,不要嘲笑您的ApplicationProperties自动装配。并且在测试属性文件中定义了language属性。