【问题标题】:How do constructor calls with the @Value annotation work?使用 @Value 注释的构造函数调用如何工作?
【发布时间】:2021-06-23 00:58:14
【问题描述】:

您好,我是 Java 和 Spring 的新手,目前遇到类似这样的情况:

在 Message.java 中

public class Message {
    final String text;
     
    public Message(@Value("${message.text}") String text) {
         this.text = text;
    }
}

在 application.properties 中:

message.text = "This is some text."

现在,我有一个测试文件,我想在其中编写一个检查字符串文本值的测试,类似于

assertEquals(text, "This is some text.");

我该怎么做呢?看来我无法通过 new Message("...") 手动调用构造函数,因为这会覆盖 @Value 注入。

【问题讨论】:

  • @Andreas 链接的问题不是重复的,因为它正在讨论如何管理字段注入; OP 的问题是关于上下文绑定。
  • @chrylis-cautiouslyoptimistic- 太糟糕了,你删除了它,因为如果你真的阅读了答案 #2#3,而不仅仅是#1,那么你会看到这个问题得到了完全的回答他们(答案:使用@TestPropertySource。仅仅因为该答案的 OP 选择接受#1,并不意味着这是最好的答案。

标签: java spring spring-boot testing javabeans


【解决方案1】:

这里的@Value 注释是对 Spring 容器的指令,所以如果你想测试它是否按预期运行,唯一的方法是使用 SpringRunner或等效于实际启动上下文并为其提供有问题的值。通常,此注解不会直接显式测试;相反,当 bean 作为 @SpringBootTest 之类的中等规模测试的一部分被覆盖时,它的值将被设置在某个地方,并期望以某种商业方式使用,其效果已经过测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2010-11-10
    • 2015-08-02
    • 2018-03-29
    • 1970-01-01
    • 2016-01-07
    相关资源
    最近更新 更多