@Mock MessageSource 在 Junit 测试中始终为 getMessage 返回 null

Posted

技术标签:

【中文标题】@Mock MessageSource 在 Junit 测试中始终为 getMessage 返回 null【英文标题】:@Mock MessageSource always returns null for getMessage in Junit test 【发布时间】:2020-05-12 21:12:28 【问题描述】:

我的测试类顶部有以下内容: @Mock private MessageSource messageSource

通过调试,我可以确认 messageSource 属性被嘲笑并且不为空。 测试用例最终到达这一点:

messageSource.getMessage("DATA.IS.EMPTY", null, Locale.ENGLISH)

我确认我的消息属性文件中有代码“DATA.IS.EMPTY”和消息字符串。我知道消息属性文件配置正确,因为我看到消息在运行时出现在应用程序中。但是,在 Junit 测试用例中,上面的 getMessage 返回为 null。查看 MessageSource 的 spring 文档,getMessage 应该返回消息字符串或 NoSuchMessageException,从不为空。由于 MessageSource 正在被模拟,是否期望在 Junit 测试用例中为 getMessage 获得空值?我没有正确嘲笑 MessageSource 吗?我知道我可以模拟 getMessage 方法来返回消息字符串,但这对我来说似乎不正确,因为我认为 JUnit 测试用例应该检查 MessageSource 是否可以在消息属性文件中找到代码。

【问题讨论】:

MessageSource 是否被注入到另一个目标测试类中? 【参考方案1】:

但这对我来说似乎不对,因为我认为 JUnit 测试用例应该检查 MessageSource 是否可以在消息属性文件中找到代码。

看来你真正需要的是真正的注射,而不是模拟的注射

这个

@Autowired
private MessageSource messageSource;

代替

@Mock
private MessageSource messageSource;

【讨论】:

【参考方案2】:

因为是mock,所以会返回null。

您必须显式配置该模拟以在提到的调用时返回某些内容,但在我看来,您想要使用实际实现,而不是模拟。

【讨论】:

以上是关于@Mock MessageSource 在 Junit 测试中始终为 getMessage 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

帮忙解决:Unable to locate MessageSource with name 'messageSource'

Spring MessageSource

使用MessageSource来管理国际化的消息资源文件

Thymeleaf + Spring (not Boot) - 如何显示来自 messageSource 的消息

Spring Boot MessageSource 在 application.properties 中不起作用

springIOC源码接口分析:MessageSource