【问题标题】:Unit Testing a Public method with private supporting methods inside of it?对包含私有支持方法的公共方法进行单元测试?
【发布时间】:2019-05-09 02:56:01
【问题描述】:

当尝试在我的 JSF 应用程序上执行测试驱动开发时,我很难理解如何使我的类更具可测试性和解耦性。例如:

@Test
public void testViewDocumentReturnsServletPath(){
    DocumentDO doc = new DocumentDO();
    doc.setID(7L);
    doc.setType(“PDF”);
    DocumentHandler dh = new DocumentHandler(doc);
    String servletPath = dh.viewDocument();
    assertTrue(servletPath, contains(“../../pdf?path=“);
}

这只有在我删除 viewDocument() 中的一些支持私有方法时才能测试(以我目前的知识),这些私有方法旨在与数据库等外部资源进行交互。

如何使用这些支持的私有方法对公共 API 进行单元测试?

【问题讨论】:

  • 如果您希望方法可测试,请删除 private 并添加 final。这为您提供了与私有方法相同的性能,但可以在外部进行测试。如果您担心其他类调用您的 now package visible 方法,请考虑制作更细粒度的包。

标签: java unit-testing testing junit encapsulation


【解决方案1】:

单元测试通常包括模拟函数所依赖的外部依赖项以获得受控输出。这意味着,如果您的私有方法调用 API,您可以使用 Mockito 之类的框架来强制执行特定的返回值,然后您可以使用该值来确保您的代码以您期望的方式处理该值。例如,在 Mockito 中,这看起来像:

when(someApiCall).thenReturn(someResource);

如果您希望与数据库或您正在测试的方法无法控制的任何其他外部资源进行交互,则同样的结构也成立。

【讨论】:

  • 并且为了使用模拟框架,您需要在被测类中“启动”某种依赖注入。模拟框架通常模拟接口和抽象类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多