Kotlin Junit-如何以字符串形式获取测试结果?
我正在尝试测试代码,并将结果作为字符串发送给APIKotlin Junit-如何以字符串形式获取测试结果?,kotlin,junit,Kotlin,Junit,我正在尝试测试代码,并将结果作为字符串发送给API class FirstClass{ fun main(){ print("Hello world!") } } 测试: 测试正在通过,但是,我没有看到打印的消息。如何以字符串形式获取测试结果?这里有几个问题。 主要是: 重定向也会影响您的测试方法。 因为您已重定向了System.out,测试方法中的print()将转到outContent,以及您要测试的first class.main()
class FirstClass{
fun main(){
print("Hello world!")
}
}
测试:
测试正在通过,但是,我没有看到打印的消息。如何以字符串形式获取测试结果?这里有几个问题。 主要是: 重定向也会影响您的测试方法。 因为您已重定向了
System.out
,测试方法中的print()
将转到outContent
,以及您要测试的first class.main()
的输出,而不是转到屏幕或任何您想要的地方
我可以看到两种修复方法
快速方法是将测试方法输出到originalOut
:
originalOut.print("Test result: $testResult")
您的测试方法位于执行重定向的类中,因此知道重定向没有问题,并且它已经可以访问originalOut
但是,如果可以的话,我认为更好的解决方案是重构FirstClass
,这样它就不会硬编码它写入的流。 例如,流可以作为参数传递;或者它可以直接返回字符串(调用方可以在一个薄的未测试包装中将其写入System.out
)
这将是更多的工作,但会使您的代码更灵活,也更容易测试
其他问题包括:
您使用的是print()
而不是println()
。
许多流是行缓冲的,只在换行后写入它们的输出,因此如果没有换行,您可能看不到任何结果。 (即使你这样做了,所有的结果都会被卡在一条线上!)
分配assertEquals()的结果。
assertEquals()
没有有用的返回值。 (它返回单位
) 因此,您的代码将简单地显示:
Test result: kotlin.Unit
相反,与所有的assert
函数一样,如果断言失败,它会抛出一个异常。 因此,存储或处理返回值没有意义;只要调用断言就足够了
-这意味着通常不需要从测试方法调用print()
/println()
! 如果出现故障,很明显:从命令行运行将停止,并显示异常消息和堆栈跟踪;IntelliJ在该测试旁边显示一个大的红色标记;Maven和Gradle将停止构建(在所有测试运行之后),显示失败的数量。 所以如果一切顺利,你就知道测试已经通过了
未定义Api
。
上面发布的代码不会编译,因为它不包含Api
的定义或导入。 (尽管最后几行可以删除,但不会影响问题。)
main()
对于测试来说是一个容易混淆的名称。
单元测试框架将查找并运行带有@test
注释的所有测试方法。 一个测试类通常会包含许多不同的测试方法,通常会以测试的方面命名。 (这让任何失败都更加清晰。) 调用它main()
Test result: kotlin.Unit