重构以公开用于单元测试的私有方法

Refactoring to expose private methods for unit testing

我有一个 class 可以处理字符串并依次对其执行许多操作。

需要按特定顺序执行这些操作。

示例:

public String process(String stringToProcess) throws Exception {

    processedString = process1(processedString);
    processedString = process2(processedString);
    processedString = process3(processedString);
    processedString = process4(processedString);
    ...
    processedString = process10(processedString);
    ...

    return processedString;
}

我确信有更好的方法来重构它以使其更清晰,但最重要的是,我希望能够对 process1、process2 等进行单元测试

注意 process1、2 等...可以是 2 行方法或大方法。

我需要处理方法以某种方式 public 来测试它们。是否有可以实现此目的的设计模式?

我考虑过使用枚举来实现这一点,但我认为这不知何故让它变得更加混乱。这个实现肯定不是最好的,但是一看就知道发生了什么。

编辑:这种方法对我来说还不错,但是所有的过程方法都应该是私有的。我想对它们进行单元测试。 我看到了这个question,所以即使是私有的我也可以测试它们,但第一步是确保它不能做得更好。

您可以看一下 http://www.codeproject.com/Articles/455228/Design-Patterns-3-of-3-Behavioral-Design-Patterns#Chain 但也许这对您的任务有点矫枉过正。

我要做的是提取 process1process2 等以分离 classes。然后你可以 a) 分别用单元测试测试它们 b) 将它们注入你的 class 并按必要的顺序在 process 方法中使用它们。

也看看这个post:Design Pattern for a multi-step algorithm也许你会从那里得到一些想法。

您可以将 "private" 方法指定为包保护。只有同一包上的 类(但来自不同的源文件夹,如 src/main/java 和 src/test/java 或...来自不同的项目)可以访问这些方法。

private void myPrivateMethod(){}

会变成

/*no visibility keyword for declaring a method package protected*/
void myPrivateMethod(){}