如何在重构生产代码的同时重构测试代码?

5

假设你从一个自动生成的方法开始

public void setKey(Key key) {
    this.key = key;
}

并编写一个相关的测试

@Test
public void testSetKey() 

三个月后,你决定将该方法更名为changeKeyTo。你重构了生产代码,最终结果如下:

public void changeKeyTo(Key key) {
    this.key = key;
}

生活很美好,然而你的测试名称仍未改变。

@Test
public void testSetKey() 

你如何处理这样的情况?你能否自动重构测试代码以适应生产代码?Eclipse是否支持此功能?

1
可能是 https://dev59.com/BXA75IYBdhLWcg3wZ4Jr 的重复问题,当重命名类时自动重命名单元测试类是否可行。 - nobeh
2
@BehroozNobakht,这不是重复的问题 - 这是关于重命名同时也从测试中调用的方法。这是绝对必要的,否则您的测试代码将无法编译。类似于被测试类的方式重命名测试是一个很好的功能,缺少它不会立即引起任何问题。您的单元测试仍然可以完美地编译和运行,只是更难以看到测试类和被测试类之间的逻辑依赖关系。 - Péter Török
1
这是一个非常好的、深思熟虑的关于职业的问题,在理想的情况下,我可能会建议程序员场所。其中需要考虑的一件事是保留自动生成的方法,因为这些方法可以通过类生成进行刷新,如果你想要“更合适的名称”,可以对其进行包装。但这只是一个狭窄的观点;我认为这个问题值得更广泛的讨论。 - hardmath
可能是。我从问题中理解到的是,JAM需要持续地重构他的代码,包括重命名方法和类,这也应该反映在测试类中。这是在所提到的问题中讨论的一个话题。 - nobeh
1
@JAM:方法changeKeyTo可以更改为changeKeyIfNullToupdateKeyadaptKey或其他任何名称(我只是编造的),但它不应该变成feedTheGorillacleanTheCar。如果它变化如此之大,那么你的测试可能需要重写。因此,当我进行这样的重构时,我更喜欢不改变我的测试方法名称:在提交时已经有足够多的事情需要验证,不要“污染”更改与测试方法名称的更改。我会仔细审查每个提交和每一行代码以节省时间。但当然,你的情况可能有所不同:)(顺便加1分) - TacticalCoder
显示剩余2条评论
2个回答

1

Eclipse 无法自动更改以下内容:

它只会更改其他类或同一类中使用的方法的引用。
如果您真的想让此功能起作用,可以像我为我的项目所做的那样扩展Eclipse重构 API,并为其提供这个新功能。
如果您需要任何参考,请随时向我询问;-)


1
请告诉我们更多。我相信许多人会受益于这个问题的解决方法。 - James Raitsev
1
请看这里,你所有的问题都会得到解决:https://dev59.com/YGox5IYBdhLWcg3wjE9i - GingerHead

0

大多数带有自动重构支持的IDE也会将测试代码中对您方法的调用进行重命名(如果您将测试代码放在同一个项目中,以便IDE可以看到)。我记得Eclipse也能做到这一点,上次我使用它时它就可以了。我现在正在使用的IntelliJ也可以实现这个功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接