当前位置: 首页 > 知识库问答 >
问题:

如何模拟私有方法而不使用PowerMock中的准备注释?

慕鸿波
2023-03-14

我正在尝试使用JaCoCo生成代码覆盖率报告。我的公司明确规定我必须只使用JaCoCo。不幸的是,有一个测试用例,我需要使用PowerMock来模拟私有方法。所以我必须使用@PREareFor注释和@RunBy(PowerMockRunner.class)注释。当我尝试使用gradle干净构建JacocoTestReport在gradle中生成报告时,由于注释,代码覆盖率不涵盖此测试用例。有解决方法吗?

共有2个答案

鲁俊友
2023-03-14

我得到了PowerMockito的报道,但我认为它并不适用于所有情况。仅当要测试的类具有超类时,它才会起作用。让我解释一下。

这可能是你要考的课

class ClassToBeTested extends/implements SuperClass/interface {
//Code 

}

例如,如果要为名为“ClassToBeTested”的类编写单元测试,并且它具有一些必须模拟的私有方法或构造函数。因此,通常您会尝试使用PowerMockito来模拟私有方法,它大致看起来像下面的东西。

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassToBeTested.class)
class ClassToBeTestedTest {
//Lots or some test code here 

}

现在您将无法获得“ClassToBeTested”的代码覆盖率。但是在PrepareForest注释中,如果我们使用要测试的类实现的超类或接口,而不是下面的原始类。

@RunWith(PowerMockRunner.class)
@PrepareForTest(SuperClass.class)
class ClassToBeTestedTest {
//Lots or some test code here 

}

我得到了这个的代码覆盖。但只有当您的classToBeTested有一些超类时,这才有效。这只是一个快速和肮脏的修复,但不是烫发。每个人的解决方案。

解博明
2023-03-14

您有两种方法:

  • 如本文所述,使用离线JaCoCo检测。对于Gradle示例,您可以在此处找到:
  • 尝试使用ByteBuddy并重新定义包含私有方法的类,并为该方法添加处理程序。ByteBuddy与Javassist的不同之处在于,它使用已加载的、已经由JaCoCo插装的类
 类似资料:
  • 我正在尝试测试下一种方法: 称为PrivateMethod: asyncTask的执行无法在Mockito的测试中完成,所以我需要以某种方式模拟它。我试着用PowerMock来嘲弄私有方法: 这在PowerMockito行(NullPointerException)中给了我一个异常,它说 方法引发了“org.mockito.exceptions.Misusing.UnfinishedStubbin

  • 我想为我拥有的一个类编写一个单元测试。这个类有一个公共方法,在公共方法内部有对同一个类中的私有方法的调用。我想模拟对那些私有方法的调用。类与此类似: 对于我的单元测试,我尝试将PowerMock与Mockito和TestNG一起使用。下面是我对测试SomePublicMethod的测试的尝试: 当我运行这个测试时,我会得到一个异常和一些提示: 我在网上看了一些例子,但是我还没有找到一个专门使用Po

  • 下面是从测试中的类调用的类的代码示例 所以我的问题是如何成功地模拟CodeWithAnotherPrivateMethod类的doTheGamble()方法,使其始终返回true?

  • 我遇到一个关于注入的mock注释类中的mock私有方法的问题。我的代码如下 当我用power mockito创建一个UT类时,foo类应该是@injectMocks,因为foBean应该作为模拟类注入。但是当foo类被标记为@injectMocks时,它不能像“do返回”(“xxx”)那样模仿它的私有方法。当(foo,“方法2”)时,它会引起关于这不能应用于injectMocks的错误。 它被封锁

  • 问题内容: 我正在尝试模拟私有静态方法。见下面的代码 这是我的测试代码 但是我运行的每个瓦片都会出现此异常 我想我在嘲弄东西时做错了什么。有什么想法我该如何解决? 问题答案: 为此,您可以使用和。 此外,您必须在测试类中指定PowerMock运行器,并准备要进行测试的类,如下所示: 希望对您有帮助。