当前位置: 首页 > 面试题库 >

@TestPropertySource不适用于Spring 1.2.6中带有AnnotationConfigContextLoader的JUnit测试

颛孙建业
2023-03-14
问题内容

在Spring 4.1.17中使用Spring Boot 1.2.6.RELEASE似乎没有任何作用。我只想访问应用程序属性,并在必要时用测试覆盖它们(无需使用hack手动注入PropertySource)

这不起作用..

@TestPropertySource(properties = {"elastic.index=test_index"})

也没有。

@TestPropertySource(locations = "/classpath:document.properties")

也不是

@PropertySource("classpath:/document.properties")

完整的测试用例..

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
@TestPropertySource(properties = {"elastic.index=test_index"})
public class PropertyTests {
    @Value("${elastic.index}")
    String index;

    @Configuration
    @TestPropertySource(properties = {"elastic.index=test_index"})
    static class ContextConfiguration {
    }

    @Test
    public void wtf() {
        assertEquals("test_index", index);
    }
}

导致

org.junit.ComparisonFailure: 
Expected :test_index
Actual   :${elastic.index}

似乎在3.x和4.x之间有很多相互矛盾的信息,我找不到可以肯定使用的任何信息。


问题答案:

事实证明,最好的方法(直到Spring修复此监督)是一种PropertySourcesPlaceholderConfigurer将引入test.properties(或任何你想要的东西)@Import或扩展它的方法@Configuration

import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import java.io.IOException;

@Configuration
public class PropertyTestConfiguration {
    @Bean
    public PropertyPlaceholderConfigurer propertyPlaceholderConfigurer() throws IOException {
        final PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        ppc.setLocations(ArrayUtils.addAll(
                        new PathMatchingResourcePatternResolver().getResources("classpath*:application.properties"),
                        new PathMatchingResourcePatternResolver().getResources("classpath*:test.properties")
                )
        );

        return ppc;
    }

}

这使你可以在application.properties中定义默认值,并在test.properties中覆盖它们。当然,如果你有多个方案,则可以PropertyTestConfiguration根据需要配置该类。

并在单元测试中使用它。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
public class PropertyTests {
    @Value("${elastic.index}")
    String index;

    @Configuration
    @Import({PropertyTestConfiguration.class})
    static class ContextConfiguration {
    }
}


 类似资料:
  • 似乎我在Spring 4.1.17中使用Spring Boot1.2.6.RELEASE做的任何事情都不起作用。我只想访问应用程序属性并在必要时使用test覆盖它们(无需使用hack手动注入Property tySource) 这不工作... 这也不是. 也不是这个... 完整的测试用例... 导致 似乎3.x和4.x之间有很多相互矛盾的信息,我找不到任何可以肯定的东西。 如有任何见解,将不胜感激

  • 我正在为我的项目创建junit测试用例。我有下面的代码,我想在其中创建一个模拟, 我正在使用jUnit和mockito核心jar。我尝试了下面的代码, 使用上述代码,它在模拟loadProperties方法时抛出错误。如何模拟Spring静态类并返回我的模拟属性对象? 任何帮助都将不胜感激。

  • 我是scala新手,junit测试用例不在集成测试中运行。 我在build.sbt中添加了 请帮助我运行集成测试

  • 我想在被测试的类中存根一个私有方法。我正在使用junit 5。我以前使用过powermock来实现这一点。不幸的是,junit 5不能与powermock一起使用。 为了更好地解释这个问题,我简化了这个例子。我有一个类,它有一个在公共方法内调用的私有助手方法。如下所示: 现在我想单元测试的方法。我已经使用jUnit 5和mockito来实现Service类的单元测试。 我将感谢任何帮助和指导来解决

  • 更新 根据新的构建系统,层次结构应该如下所示: 我还尝试扩展AndroidTestCase,并在两个父类中都收到了这个错误: 我尝试用这个解决方案解决这个错误,但是项目结构模块依赖项部分没有Android 1.6平台。所以,基本上,我不知道如何在类路径中将junit依赖项移到Android依赖项之上。

  • 问题内容: 我有一些通用的设置代码,已将这些代码分解为标记为的方法。但是,不必为每个测试都运行所有这些代码。有没有一种标记方式,使得该方法仅在某些测试之前运行? 问题答案: 只需将不需要安装代码的测试移到单独的测试类中即可。如果您有一些测试通用的其他代码,可以帮助保留这些代码,请将其移到帮助程序类中。