Unit testing 如何使用PowerMock模拟Kotlin类(最终版)?

Unit testing 如何使用PowerMock模拟Kotlin类(最终版)?,unit-testing,junit,kotlin,powermock,Unit Testing,Junit,Kotlin,Powermock,我想知道如何使用PowerMock模拟kotlin最终类,以便对其进行测试。我遵循了测试Java最终类的指南,但仍然出现了这个错误 Cannot subclass final class 有什么方法可以做到这一点吗?只需为类创建接口。然后,您可以使用接口简单地模拟类。使用Mockito 2.1.0+您还可以模拟最终类。此功能是可选的,因此您必须通过添加Mockito扩展来启用它。 为此: 创建一个名为org.mockito.plugins.MockMaker的文件,并将其放置在测试文件夹中的

我想知道如何使用PowerMock模拟kotlin最终类,以便对其进行测试。我遵循了测试Java最终类的指南,但仍然出现了这个错误

Cannot subclass final class

有什么方法可以做到这一点吗?

只需为类创建接口。然后,您可以使用接口简单地模拟类。

使用Mockito 2.1.0+您还可以模拟最终类。此功能是可选的,因此您必须通过添加Mockito扩展来启用它。 为此:

  • 创建一个名为org.mockito.plugins.MockMaker的文件,并将其放置在测试文件夹中的resources/mockito extensions目录下
  • 该文件包含一行:mock maker inline

你可以在中找到更多信息。

准确地说:我猜你的意思是:你想模拟最后一个X类;因此,您可以测试其他使用X的类Y。您可以看到,为了测试X,您不需要模拟X本身。不幸的是,我没有答案,但有一个警告:是的,PowerMock允许您模拟最终类或静态方法;但另一方面,要准备好面对各种奇怪的问题。只有在您确实无法更改“输入代码”(例如,通过去掉“final”修饰符)时才可以使用PowerMock。@Jägermeister我以前从未使用过PowerMock。您可能会面临哪些奇怪的问题?PowerMock处理字节码。所以首先,您不是在测试类文件,而是在测试PowerMock用它们创建的东西。然后:作为PowerMock工具字节码,它与依赖字节码的其他框架冲突;例如,覆盖工具。最后:我花了无数时间调试PowerMock测试用例中的“奇怪”失败,从未在代码中发现任何真正的问题。PowerMock就像一把安全开关坏了的突击步枪:它大部分时间都能工作,但如果它不时意外地将子弹射入你的脑袋,不要生气/惊讶。你在使用@PrepareForest(::类)吗测试类上的注释?不确定仅仅因为测试限制而修改和污染主代码是否是一个好主意。PowerMock和Mockito 2可以处理这个限制(请参阅我对@Januson关于Mockito 2的回答的评论),在我的开发人员经验中,为包含一些业务逻辑的类创建接口在大多数情况下都是很好的做法。这实际上是一个有争议的话题,但创建不必要的接口并不总是减少耦合,它只是创建样板(Kotlin的目标是首先减少样板)。当您有多个实现时,针对接口进行编码是很好的,或者从体系结构的角度来看,它很有用,或者有助于依赖项注入,但是,否则它会使代码复杂化,应该避免。请看这里的评论:由于Mockito(Mockito 2.5.0版本仍然存在)和Robolectric中的错误,此扩展不适用于Robolectric runner。Robolectric存储库中有一个open pull请求来解决这个问题,但在合并之前,我们需要坚持使用PowerMock。有关更多信息,请参阅问题:和PR:此解决方案有效,但会减慢测试速度。同样的结果没有性能下降