当前位置: 首页 > 知识库问答 >
问题:

为什么来自Applicion.properties的属性在Spring Boot应用程序的Junit测试中不可用?

应瀚
2023-03-14

我有一个Spring启动应用程序。我正在编写Junit测试。我试图从application.properties(在src/main/resources/application.properties中定义)和AppConfig(src/main/java/hello/AppConfig.java)中配置的状态bean注入值。我看到bean是autowired(通过调试器,它不是null),但没有设置值。

下面是application.properties

app.name=rest-service
app.version=1.0.0-SNAPSHOT
@Configuration
public class AppConfig {

    @Value("${app.version}")
    private String version;
    @Value("${app.name}")
    private String name;


    @Bean
    public Status status(){
        return new Status(name,version);
    }

}

src/test/java/hello/greetingControllerTests.java

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@ContextConfiguration(classes={hello.TestConfig.class,hello.AppConfig.class})
@WebAppConfiguration
public class GreetingControllerTests {


    @Autowired
    Environment envi;

    @Autowired
    Status status;

    @Value("${app.name:notConfigured}")
    String appName;

    private String env;

    @Before
    public void init(){
        System.out.println(status.getName());
        System.out.println(appName);
        env=envi.getActiveProfiles()[0];
    }

    @Test
    public void should_fail(){
        if (env.equalsIgnoreCase("DEV")){
            assertThat(false).isFalse();
        }
        if (env.equalsIgnoreCase("QA1")){
            System.out.println("failing the test");
            fail();
        }
    }
}

我在init方法中设置了debugger,发现没有注入设置了正确值的appnamestatusbean。但是已经注入了状态bean。只是值没有设置。

共有1个答案

宓和同
2023-03-14

感谢您对项目的分享。它使它更容易工作。请看我的拉请求(与评论),以了解我如何得到它所有的工作。

https://bitbucket.org/springdevseattle/gs-rest-service/pull-requests/4/updating-project-for-spring-boot-14/diff

*更新*由于将一些旧的Spring注释与较新的注释混合,您的注释被覆盖了。spring-boot properties not@autowired为我指出了基于google搜索应用程序的解决方案。properties未在环境中填充

@ContextConfiguration(loader = SpringApplicationContextLoader.class)
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Deprecated
public @interface SpringApplicationConfiguration {
@ContextConfiguration(classes={hello.TestConfig.class,hello.AppConfig.class})

这迫使Spring只加载TestConfig和AppConfig类,而不扫描任何其他配置文件。注释掉注释并运行它将使测试通过,调试init()方法将显示注入的值。

 类似资料:
  • 我正在学习JUnit5和测试用例。我使用的是spring boot version'2.2.6.Release和JUnit5,在我的应用程序中,我有一个基于属性文件中的布尔标志进行处理的方法。 \src\main\resources\application.properties 数据库连接属性用于创建数据库连接 ControllerTest.java 默认情况下,该标志为false,因此每次测试用

  • 我正在使用Spring Boot(不使用父POM)来学习Spring文档。在我的父POM中,我正在部分中定义对的导入依赖项。然后,在我的子POM中,我定义了对的依赖关系,而不指定任何版本。当我查看dependency:树时,我看到所有的jersey依赖都使用中指定的版本。一切都很好。 现在,在我的孩子POM中,我需要添加另一个泽西依赖项。在POM中,我看到定义了一个属性。但是,当我在子POM中使用

  • 我有一个应用类 我有控制器课 并且,我想为Application test编写一个测试用例,以确保创建的实例类型为HelloController 但是,我在自动连接 hello控制器变量时遇到错误(找不到 hello 控制器类型的 bean)。根据我的理解,@SpringBootTest应该创建上下文并返回一个实例。我们不需要编写任何上下文 xml 或使用任何注释Config 类来获取实例。缺少了

  • 我做错了什么?我正在使用这个小型独立应用程序,它运行并查找我的。相同的配置在JUnit中不起作用,请参阅下面: 以下不起作用,中的相同属性未加载并且只有值:

  • 我正在使用一个spring启动应用程序,它运行我的src/main/resources/config/application。yml。 当我通过以下方式运行测试用例时: 测试代码仍在运行我的应用程序。要加载属性的yml文件。我想知道是否有可能再运行一个*。运行测试用例时的yml文件。

  • 我试着去理解Spring是怎么跟所有的事情联系在一起的。然而,我不明白为什么在单元测试spring代码时使用mockito?spring不能处理与mockito相同的DI吗?莫基托贡献了什么是纯泉所不可能做到的? 澄清:我的想法是,我可以使用一个不同的应用程序上下文来进行测试,在这里创建我需要的存根bean作为虚拟对象。