有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在测试中注入bean的属性源

我正在Java的Spring中为我的服务编写单元测试。我模拟测试类中的所有依赖项,并在构造函数中实例化测试类,并将模拟类传递给构造函数。问题是被测试的类从中注入属性。属性文件转换为其中的字段(比如字符串)

在我测试的类中,我使用类级别上的@PropertySource和字段级别上的@Value的标准组合

正如我们所知,当类通过构造函数实例化时,属性注入失败(在Spring容器初始化期间不是作为bean)。你如何处理这样的问题

我有一个解决方案,尽管我认为它不好,也不令人满意,那就是: 1.正常地@Autowire测试下的类,然后使用setter替换其所有依赖项

我还知道@TestPropertySource注释,如果我理解正确,它不会提供解决方案,它只是覆盖现有属性的一种方法——事实并非如此,因为我们无法真正使用任何属性

提前感谢您的帮助:)


共 (1) 个答案

  1. # 1 楼答案

    这很简单:在单元测试中,将属性注入字符串字段,并在容器加载Spring上下文后调用的钩子方法中创建被测对象,而不是在测试类的构造函数中
    在JUnit4中,用@Before指定这个钩子方法,在JUnit5中用@BeforeEach指定这个钩子方法

    它会给出类似于:

    @RunWith(SpringJUnit4ClassRunner.class)
    public class FooTest{
    
        Foo foo;
        @Value("${myProp}") 
        String myProp;
    
        @BeforeEach
        public void beforeEach(){
           foo = new Foo(myProp);
        }
    }
    

    请注意,为了更快地执行测试,应该只从Spring上下文加载测试所需的内容:环境部分