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

@Value延迟变种仅在从测试中调用时不会实例化

尚鸿才
2023-03-14

测试时,我在使用application.properties值时遇到问题。

这是我的代码:

@Repository
class RedisSubscriptionStore(): SubscriptionStore {
@Value("\${default.package}")
lateinit var defaultPackageForFCMInstance: String }

这和预期的一样工作。它用在我的updateSubscription方法中,正确的值来自application.properties

问题出在我的测试中,当我使用这个类时,这个值没有被实例化并抛出一个错误

@SpringBootTest()
@Tag("integration")
internal class RedisSubscriptionStoreIntegTest @Autowired constructor(
    val objectMapper: ObjectMapper,
    val redisTemplate: RedisTemplate<String, String>
) {
    val sut = RedisSubscriptionStore(redisTemplate, objectMapper)

@Test
    fun `return 200 when updating subscription`() {
        sut.updateSubscription(updatedSub)

        //Assert
        val newlyUpdatedSub = getSubscription(updatedSub.peerID)
        Assertions.assertEquals(updatedSub, newlyUpdatedSub)
}

但这会引发错误:lateinit属性defaultPackageForFCMInstance尚未初始化

即使这适用于正确的值:

@SpringBootTest()
    @Tag("integration")
    internal class RedisSubscriptionStoreIntegTest @Autowired constructor(
        val objectMapper: ObjectMapper,
        val redisTemplate: RedisTemplate<String, String>
    ) {

     @Value("\${default.package}")
     lateinit var defaultPackageForFCMInstance: String
}

那么为什么从我的测试类调用时,我的defaultPackageForFCMInstance没有初始化呢?显然它有一个值,在从sut调用它之前,我已经尝试在测试类中打印出来

共有1个答案

吴丁雷
2023-03-14

您正在实例化RedisSubscriptionStore

所以Spring是没有办法注入价值的。要么也在构造函数中传递该值,要么在测试中使用injecation

 @Autowired
 var sut: RedisSubscriptionStore
 类似资料:
  • 本文向大家介绍python 实现ping测试延迟的两种方法,包括了python 实现ping测试延迟的两种方法的使用技巧和注意事项,需要的朋友参考一下 一.python实现ping返回延迟繁琐版 二 .python实现ping返回延迟简单版本 以上就是python 实现ping测试延迟的两种方法的详细内容,更多关于python ping测试延迟的资料请关注呐喊教程其它相关文章!

  • 延迟调用一个函数,直到当前调用堆栈已经清除。 使用 setTimeout() ,超时时间为1ms,将新事件添加到浏览器事件队列,并允许渲染引擎完成其工作。使用展开 (...) 运算符为函数提供任意数量的参数。 const defer = (fn, ...args) => setTimeout(fn, 1, ...args); // Example A: defer(console.log, 'a

  • Go 语言中没有提供其它面向对象语言的析构函数,但是 Go 语言提供了 defer 语句用于实现其它面向对象语言析构函数的功能 defer 语句常用于 释放资源、解除锁定 以及 错误处理 等 例如C语言中我们申请了一块内存空间,那么不使用时我们就必须释放这块存储空间 例如C语言中我们打开了一个文件,那么我们不使用时就要关闭这个文件 例如C语言中我们打开了一个数据库, 那么我们不使用时就要关闭这个数

  • 我有一个iBeacons应用程序能够在后台或不运行时范围内的信标。我实现了,它们工作正常,这意味着当我到达信标的范围时,我会收到通知。 由于没有真正的信标,我创建了一个应用程序(对于另一个设备,比如下一个场景中的iPad),它的作用类似于两个不同的信标,这意味着它可以广播两个不同的信号,相同的,但不同的值(称这个信标为a和B),一次一个。我的问题是在这种情况下: 有我的iPhone(与iBeaco

  • 我在一个服务中使用了一个自动连接的构造函数,当在测试类中实例化时,它会导致@Value注释返回null。自动关联依赖项直接解决了这个问题,但项目遵循使用基于构造函数的自动关联的惯例。我的理解是,在测试类中实例化服务并不是从Spring IoC容器创建服务,这会导致@Value返回null。有没有一种方法可以使用基于构造函数的自动连接从IoC容器创建服务,而不必直接访问应用程序上下文? 示例服务:

  • 我有cxfweb服务,我使用异步方法调用。我使用回调方法(使用javax.xml.ws.asynchHandler-http://cxf.apache.org/docs/developing-a-consumer.html)以获得如下响应: 这个方法很好,我得到了正确的响应。 我的问题是性能。我测量了刚好在上面行所需的时间,我的应用程序显示大约2000ms的上线(我用jmeter做了测试)。我的应