我想对类中的一个函数进行一些单元测试,简化示例:
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(如果确实有必要,我仍然可以切换,但是由于项目很大,我希望保持所有内容一致。
我可以在需要时提供一个更详细的示例,因为这只是一个非常简化的欺骗示例。
答案 0 :(得分:1)
如何向logColumns添加另一行,如下所示
df.columns.mkString(" ")
将方法的返回类型更改为String,然后使用该类型在测试中运行断言?
答案 1 :(得分:0)
前一段时间通过在我的testlog4j2.xml中添加一个附加程序来修复此问题,该附加程序记录到文件中。然后,我可以读入文件,并在其上运行单元测试。