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

时间:2016-04-21 23:44:53

标签: java design-patterns refactoring

我有一个处理字符串的类,并依次对其执行许多操作。

这些行动需要按特定顺序进行。

示例:

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行方法还是大方法。

我需要过程方法以某种方式公开来测试它们。是否有设计模式可以实现这一目标?

我考虑使用枚举来实现这一目标,但我认为它在某种程度上让它变得更加混乱。这种实现并不是最好的,但是乍一看,你知道发生了什么。

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

2 个答案:

答案 0 :(得分:1)

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

我要做的是将process1process2等提取到不同的类中。然后你可以a)单独用单元测试测试它们b)将它们注入你的班级并按照process方法按必要顺序使用它们。

还要看一下这篇文章:Design Pattern for a multi-step algorithm也许你会从那里得到一些想法。

答案 1 :(得分:0)

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

private void myPrivateMethod(){}

会变成

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