我想在类中对函数进行一些单元测试,简化示例:
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")
}
}
现在我知道这不会运行,因为我的列不输出字符串,我也不想重写/引用我的整个DataChecks类来实现这一点。
现在我想知道:是否可以捕获log4j的控制台输出并将其转换为String?或者可以模拟我的记录器类来输出字符串吗?(我尝试过Mockito,但没有成功。(
我的(必需的(依赖项是log4j&FunSuite(如果真的有必要,我仍然可以切换,但由于项目相当大,我希望保持所有东西的一致性。
我可以在需要时提供一个更详细的示例,因为这只是一个非常简化的欺骗示例。
如何在logColumns中添加另一行,如下所示df.columns.mkString(" ")
将方法的返回类型更改为String,然后使用它在测试中运行断言?
通过在我的testlog4j2.xml中添加一个appender修复了这个btw,该appender记录到一个文件中。然后我可以读取该文件,并让我的单元测试在上面运行。