如何使用junit和mockito为私有void方法编写测试用例[重复]

Posted

技术标签:

【中文标题】如何使用junit和mockito为私有void方法编写测试用例[重复]【英文标题】:How to write test cases for private void methods using junit and mockito [duplicate] 【发布时间】:2017-09-02 13:26:29 【问题描述】:

我们可以为 setAddr() 方法编写测试用例,因为它是私有的 void 方法,请帮助我吗?

class WCfg  

private void setAddr(Cfg cfg, String... arg)
         throws Exception 
try 

 catch (Exception e) 
  throw new Exception("Invalid IP address.", e);



public String process(String... arg) throws Exception 
  MCfg mCfg = new MCfg();

  try 
    setAddr(mCfg, arg);

   catch (Exception e) 
    return "Wrong argument format.";
  
  cfg.write();

  return "success";
 

【问题讨论】:

你不应该为你的私有方法写测试。 可以使用reflection访问方法,也可以使用PowerMock 提示:下次试试你最喜欢的搜索引擎 ;-) 【参考方案1】:

每个私有方法总是直接或直接在某些公共或可访问方法中调用。 所以,无需为他们写案例。

如果您想为此编写测试用例,请使用:

Deencapsulation.invoke(SomeClassWherePrivateMethod.class, "methodName", argument1, argument2, argument3);

这里Deencapsulation 来自mockit.Deencapsulation

你可以Download jar from here。

【讨论】:

【参考方案2】:

如果你真的需要,你可以使用反射。参见示例:http://onjavahell.blogspot.nl/2009/05/testing-private-methods-using.html

还要阅读 cmets!我强烈建议不要这样做。如果您无法测试您的代码,这通常是糟糕设计的标志。

【讨论】:

【参考方案3】:

如上所述,您不应该测试私有方法。始终测试您班级的合同而不是实施。否则,如果你的类的实现被改变,你会得到假阴性测试结果。我的意思是类的行为符合预期,但测试会失败。

如果您在private 方法中有复杂的逻辑,您应该考虑将其提取到单独的类中。 这个类可以是package-private,也可以复用提取出来的代码。

【讨论】:

以上是关于如何使用junit和mockito为私有void方法编写测试用例[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用mockito和junit为Java中的ExecutorService编写测试用例?

如何使用 mockito 为以下代码编写 junit 测试?

如何使用 JUnit 在 Spring Boot 中的公共方法中模拟私有方法

如何使用 mockito 和 junit 测试此功能?

如何在 JUnit5 中使用 Mockito

如何使用 Mockito 和 JUnit 在 Spring Boot 中测试 POST 方法