Scala / Spark单元测试日志记录log4j

时间:2018-11-01 15:45:49

标签: scala unit-testing apache-spark log4j

我想对类中的一个函数进行一些单元测试,简化示例:

Class Datachecks {
   df = spark.read.parquet(..)
   val logger = Logger(getClass)
   def logColumns(df: DatFrame): Unit = {
      df.columns.foreach(logger.info(_))
}

然后我想用

之类的东西进行测试
Class DataChecksSuite extends FunSuite with initSpark {
   val initDataChecks = new DataChecks()
   val df = spark.read.parquet()
   test("Example test") {
      assert(initDataChecks.logColumns(df) === "myOutput")
   }
}

现在我知道它不会运行,因为我的列不会输出String,我也不想重写/重新定义整个DataChecks类以使其成为可能。

现在我想知道:是否可以捕获log4j的控制台输出并将其转换为String?还是可以模拟我的记录器类以输出String? (我曾尝试过Mockito,但没有成功。)

我的(必需)依赖项是log4j和FunSuite(如果确实有必要,我仍然可以切换,但是由于项目很大,我希望保持所有内容一致。

我可以在需要时提供一个更详细的示例,因为这只是一个非常简化的欺骗示例。

2 个答案:

答案 0 :(得分:1)

如何向logColumns添加另一行,如下所示     df.columns.mkString(" ") 将方法的返回类型更改为String,然后使用该类型在测试中运行断言?

答案 1 :(得分:0)

前一段时间通过在我的testlog4j2.xml中添加一个附加程序来修复此问题,该附加程序记录到文件中。然后,我可以读入文件,并在其上运行单元测试。