gpt4 book ai didi

unit-testing - 您如何测试/更改未经测试和不可测试的代码?

转载 作者:行者123 更新时间:2023-12-04 04:01:49 26 4
gpt4 key购买 nike

最近我不得不在旧系统上更改一些代码,其中并非所有代码都有单元测试。
在进行更改之前,我想编写测试,但是每个类都创建了很多依赖项和其他反模式,这使得测试变得非常困难。
显然,我想重构代码以使其更易于测试、编写测试然后更改它。
你会这样做吗?或者您是否会花费大量时间编写难以编写的测试,这些测试将在重构完成后大部分被删除?

最佳答案

首先,here's a great article with tips on unit testing .其次,我发现避免对旧代码进行大量更改的好方法是稍微重构它,直到您可以对其进行测试。一种简单的方法是保护私有(private)成员,然后覆盖 protected 字段。

例如,假设您有一个在构造函数期间从数据库加载一些内容的类。在这种情况下,您不能只覆盖 protected 方法,而是可以将数据库逻辑提取到 protected 字段,然后在测试中覆盖它。

public class MyClass {
public MyClass() {
// undesirable DB logic
}
}

变成
public class MyClass {
public MyClass() {
loadFromDB();
}

protected void loadFromDB() {
// undesirable DB logic
}
}

然后你的测试看起来像这样:
public class MyClassTest {
public void testSomething() {
MyClass myClass = new MyClassWrapper();
// test it
}

private static class MyClassWrapper extends MyClass {
@Override
protected void loadFromDB() {
// some mock logic
}
}
}

这是一个不好的例子,因为你可以在这种情况下使用 DBUnit,但实际上我最近在类似的情况下这样做了,因为我想测试一些与正在加载的数据完全无关的功能,所以它非常有效。我还发现这样的成员暴露在其他类似的情况下很有用,在这些情况下,我需要摆脱一些长期存在于类中的依赖关系。

但是,如果您正在编写框架,我会建议您不要使用此解决方案,除非您真的不介意将成员公开给框架的用户。

这有点骇人听闻,但我发现它非常有用。

关于unit-testing - 您如何测试/更改未经测试和不可测试的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com