使用specs2 + scalalogging 进行单元测试记录器消息

2024-02-14

我这里有一个小问题,真的不知道如何实现记录器消息的单元测试。当然,这听起来有点奇怪,但对我来说这是一个非常有趣的话题。但让我说得更具体一些。

我有一些 scala 类和测试规范:

class Testable extends Logging {
  def method() = {
    // some method calls
    logger.info("Message1")
  }
}

class TestableSpec extends Specification with ShouldMatchers with Mockito {
  "Testable instance" should {
    // some important tests 

    "print proper log message during method call" in {
      // And how to test that logger really prints proper message ("Message1")? 
    }
  }
}

我的第一个想法是拦截底层记录器引擎消息,但由于在 Testable 类中使用 mixin,实现起来似乎有点困难,因此任何执行此类操作的想法都会非常有帮助。

UPDATE:我最终进行了测试并决定与社区分享我的解决方案。我们不能直接模拟 scalalogging.Logger 类,因为它是最终的,但我们仍然可以模拟底层 slf4j Logger。澄清一个想法:

class Testable extends Logging {
    def foo() = {
        // ...
        logger.info("Foo has been called")
    }
}

// Another imports are omitted.
import com.typesafe.scalalogging.slf4j.Logger
import org.slf4j.{Logger => Underlying}

class TestableSpec extends Specification with Mockito with ShouldMatchers {
    def initTestable(mocked: Underlying): Testable = {
        new Testable() {
            override lazy val logger = Logger(mocked)
        }
    }

    "Testable instance" should {
        "invoke logger with a proper message" in {
            val mocked = mock[Underlying]
            mocked.isInfoEnabled returns true // Should be set to true for test
            initTestable(mocked).foo()

            there was one(mocked).info("Foo has been called")
        }
    }
}

感谢埃里克的帮助。他的回答是解决问题的关键。


一种可能性是使用 Mockito 来检查方法调用:

class Testable extends Logging {
  def method() = {
    // some method calls
    logger.info("Message1")
  }
}

class TestableSpec extends Specification with ShouldMatchers with Mockito {
   "Testable instance" should {
     "print proper log message during method call" in {
       val mockLogger = mock[Logger]
       val testable = new Testable {
         // switch the logger with a mock instance
         override val logger = mockLogger
       }
       testable.method()
       there was one(mockLogger).info("Message1")
     }
  }
}

这是主要思想,但您可能必须根据您的具体特征和日志框架进行调整:

  • 记录器必须是可覆盖的
  • info 方法不能是最终方法(Mockito 的限制之一)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用specs2 + scalalogging 进行单元测试记录器消息 的相关文章

随机推荐

  • c - strcmp 对于相等的字符串不返回 0

    因此 我尝试广泛寻找解决方案 但只能真正找到其中一个字符串缺少新行或空字节的帖子 我相当确定这里的情况并非如此 我正在使用以下函数将单词与包含单词列表的文件进行比较 其中每行一个单词 函数中的字典 这是代码 int isWord char
  • 在 DataGridView 的列中搜索值

    我希望用户能够在 DataGridView dgv 的列中搜索数字 dgv 可以保持许多记录 每条记录都有一个项目编号 因此 我希望用户能够在 项目编号 列中搜索项目编号 我的列是 ProjectID 不可见 图片 无标题文本 项目编号 项
  • 如何在标准输出中禁用 spring boot 徽标?

    有没有办法禁用可爱但非常明显的 ASCII Spring boot 徽标 Spring Boot v1 1 8 RELEASE 每次运行 Spring Boot 应用程序时都会
  • MySQL中使用clearDB自动加1

    我正在使用带有clearDB 的Windows Azure 当前数据库自增值为10 我希望它为1 我尝试在 PHPMyAdmin 中运行这些命令 1 set global auto increment increment 1 set glo
  • 在 Thread + Queue 或 ThreadPoolExecutor 上使用 async-await?

    我从未使用过async await语法 但我经常需要发出 HTTP S 请求并解析响应 同时等待未来的响应 为了完成这项任务 我目前使用线程池执行器 https docs python org 3 library concurrent fu
  • 从另一个类调用委托方法

    我无法弄清楚如何在 C 中对跨类的委托方法调用进行编程 我来自 Objective C 的世界 这可能会让我感到困惑 在 Objective C 中 我可以在子类中分配一个委托对象作为父类 即 childViewcontroller del
  • 自定义 asp.net 身份存储 - 为什么 HttpContext.Current 有时为空

    我按照示例集实现了 ASP NET Identity 的自定义用户存储here http www jamessturtevant com posts ASPNET Identity2 0 Custom Database 一切正常 除了这个
  • 扩展应用程序还是使用单例?

    我有一个 android 项目 其中有一个或多个活动需要访问的不同对象 现在我正在考虑创建一个子类Application然而根据文档 http developer android com reference android app Appl
  • 通过单元格的值动态设置 Excel 图表数据系列范围

    我在 Excel 中有一个简单的图表 其中绘制了 2 个数据系列 引用了第 3 个数据系列 我想要做的是根据单元格中的数字更改第一个数据系列之一的范围 例如 如果数字为 1 并且数据系列位于 A 列中 则图表的范围应为A1 A100 现在
  • 在 Yii2 中一次保存多个模型

    我有两个模型 Users and Students 我想同时将数据插入到这些表中 首先 我将数据保存到Students模型 然后进入Users楷模 现在 如果数据没有成功插入到Users模型已经有一个条目Students桌子 我想要的是仅当
  • Akka Actor 带有 TimeoutException 的“询问”和“等待”

    我正在使用 Scala 和 Akka 建模一个简单的 P2P class Node extends Peer with Actor var peers List ActorRef List def receive case register
  • iOS13 getUserMedia 不适用于 Chrome 和 Edge

    我和我的朋友正在构建一个需要相机访问权限的应用程序 但我们在让相机与 iOS 配合使用时遇到了一些问题 我们使用的是 iOS13 Safari 在获取相机内容后立即冻结 chrome 和 Edge 根本无法获取相机访问权限 我们的代码如下
  • Asp.Net MVC 中 DataAnnotations StringLength 文本框的 maxlength 属性

    我正在开发 MVC2 应用程序 想要设置文本输入的 maxlength 属性 我已经使用数据注释在模型对象上定义了 stringlength 属性 并且它正在正确验证输入字符串的长度 当模型已有信息时 我不想通过手动设置最大长度属性来在视图
  • 启动 Firefox、使用特权 nsI* API 驱动第 3 方网站的最简单方法

    启动 Firefox 最简单的方法是什么 加载第 3 方网站 我是授权的 自动化 并针对该站点运行一些 特权 API 例如 nsIProgressListener nsIWindowMediator 等 我尝试了两种方法 使用 XULrun
  • Next.js - 从节点模块的“dist”文件夹提供静态 JS 的最佳方式

    我正在使用一个使用 Tesseract OCR 从图像中读取文本的应用程序 我想从 node modules tesseract js dist 获取一些 JS 文件 并使它们可以在浏览器中下载 我知道我可以将文件复制到 public ne
  • Pandas 绘制重复的数据框

    我正在尝试绘制包含 2 列的 pandas 数据框 如下所示 For i in data1 for j in data2 traces append go Scatter x df A y df B plot A 列有重复值 当我绘制它们时
  • Grails 急切获取不会检索所有数据

    我有域类 class Person static hasMany items Item static fetchMode items eager String name Set items class Item static belongs
  • 全屏背景上的android xml可绘制图像

    我需要在 android 中使用 xml 可绘制对象 用于 cordova 启动屏幕 我想在屏幕中央显示一个透明徽标 不拉伸 而屏幕的其余部分则设置背景颜色 我首先尝试的是仅在 xml 文件中添加图像
  • 使用堆栈时无法导入 System.Directory

    我有点困惑为什么这不起作用 我有一个导入 System Directory 的小程序 当我在命令行上使用 runhaskell 运行它时 它会编译并输出我期望的内容 当我使用与堆栈相同的程序时 我收到一条消息说 无法加载 System Di
  • 使用specs2 + scalalogging 进行单元测试记录器消息

    我这里有一个小问题 真的不知道如何实现记录器消息的单元测试 当然 这听起来有点奇怪 但对我来说这是一个非常有趣的话题 但让我说得更具体一些 我有一些 scala 类和测试规范 class Testable extends Logging d