Kotlin Junit-如何以字符串形式获取测试结果?

Kotlin Junit-如何以字符串形式获取测试结果?,kotlin,junit,Kotlin,Junit,我正在尝试测试代码,并将结果作为字符串发送给API class FirstClass{ fun main(){ print("Hello world!") } } 测试: 测试正在通过,但是,我没有看到打印的消息。如何以字符串形式获取测试结果?这里有几个问题。  主要是: 重定向也会影响您的测试方法。 因为您已重定向了System.out,测试方法中的print()将转到outContent,以及您要测试的first class.main()

我正在尝试测试代码,并将结果作为字符串发送给API

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