【问题标题】:JMockit, how do I mock a private method with no returnsJMockit,我如何模拟没有返回的私有方法
【发布时间】:2014-12-05 15:15:43
【问题描述】:

我正在尝试使用 JMockit 模拟私有方法,并且正在苦苦挣扎。我一直在学习教程,并且可以模拟返回值的私有方法。此特定方法与数据库交互并且不返回任何内容。为了这个测试的目的,我想做的就是有效地屏蔽这个方法。我使用的测试格式如下图,注意通常在方法解封装被调用后会直接得到结果。

    @Test
public void testRetrieveAndSaveReport() {

    //Make class with private class final, to be used in the Exceptionsinners class
    final ESReportOutputLogic eSReportOutputLogic = new ESReportOutputLogic();

    //  Define Expectations
    //  pass eSReportOutputLogic as argument to make it a Mocked type in the Exceptions Class
    new Expectations(eSReportOutputLogic){
        ESReportOutputLogic eSReportOutputLogic;
        {
            Deepcapsulation.invoke(eSReportOutputLogic);

        }
    };

    ESReportOutputLogic rol = new ESReportOutputLogic();
    rol.retrieveAndSaveReport("","",1);

    //  asserts.....
}

【问题讨论】:

  • 既然是私有方法,你能不能只改变方法的签名来返回一些值。在这种情况下,如果数据库操作成功,则返回 0,否则返回 1。很难想象任何私有方法不会将其活动的结果传递给调用方法。可以是返回值,也可以是抛出异常。

标签: java unit-testing private jmockit


【解决方案1】:

您使用哪种抽象来与数据库交互?

我建议模拟这个而不是试图从你的测试的角度模拟一些东西should not exist

模拟私有方法意味着您实际上是在让应用程序中的代码未被测试发现。

【讨论】:

  • 感谢您的输入 [rol.retrieveAndSaveReport("","",1) 与数据库交互]。当我第一次研究它时,我被取消了,现在我回到它,我可以想出更好的方法来解决我的问题。最简单的是使用 System-rules api。这有方法 ExpectedSystemExit() 和 expectSystemExitWithStatus(int)。对于任何想要使用它的人来说,唯一的问题是他们需要获得正确的 JUnit 版本才能使用它。
猜你喜欢
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
相关资源
最近更新 更多