kotlin - 如何在 Kotlin 中进行方法检测 - 但保持方法可测试

标签 kotlin aop newrelic

我有一个方法需要检测来调用 New Relic:设置一个段,运行业务逻辑并结束该段。有没有办法在 Kotlin 中做到这一点(如在 Spring AOP 中)?

fun saveCustomer() {
   val segment = NewRelic.getAgent().transaction.startSegment("save customer")
   // business logic here
   segment.end()
}

我尝试隔离 newRelic依赖,现在可以在我的整个应用程序中重用它:
fun saveCustomer() {
   newRelic.executeWithSegment { // this starts/ends the segment and calls the function block
      // business logic here
   }
}

然而,这使得单元测试 saveCustomer更难,因为在 mock newRelic.executeWithSegment 之后(我必须这样做;否则在测试中会联系 New Relic),代码块(业务逻辑)不再执行 - 所以测试失败。

有没有办法满足这些要求? (可能带有注释或使用 Kotlin 委托(delegate)模式,甚至是一些轻量级库;不确定。)

最佳答案

您可以使用 AspectJ。

  • 它独立于 Spring,比 Spring AOP 更强大、更高效(无代理)。
  • 它应该适用于任何 JVM 语言,尽管我从未尝试将 Kotlin 作为我的方面的目标。
  • 如果您进行编译时编织,那么 AspectJ 运行时是您需要的唯一依赖项。它的大小是 120K。
  • 对于加载时编织,您需要 AspectJ 编织代理。它的大小是1.9M。
  • 关于kotlin - 如何在 Kotlin 中进行方法检测 - 但保持方法可测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57915364/

    相关文章:

    kotlin Coroutine 多次启动

    generics - Kotlin中泛型的子类型问题

    java - 关于 Cglib MethodInterceptor 调用方法的困惑

    java - 使用 New Relic 的 Spring Boot 无需修改依赖项

    android - 如何为自定义 detekt gradle 任务启用类型解析?

    android - 如何正确覆盖 Kotlin 类中的 var?

    spring - 我们可以使用 Spring-AOP 去掉 Aspects 的 bean 定义吗?

    java - Spring AOP生成的代理类所在位置

    asp.net-mvc - 如何阻止 NewRelic 在我的本地机器上运行?

    c# - BeginProcessRequest() 中发生了什么?