gpt4 book ai didi

java - 为了更好的可测试性,我们是否应该避免在 Java 代码中编写静态方法?

转载 作者:搜寻专家 更新时间:2023-10-30 21:24:04 25 4
gpt4 key购买 nike

我更喜欢在我的 java 代码中使用静态方法,因为我认为它们“功能性”“无状态”并且副作用较小。所以可能会有一些像这样的辅助类和方法:

public class MyHelper {
public static Set<String> array2set(String[] items) { ... }
public static List<String> array2list(String[] items) { ...}
public static String getContentOfUrl(String url) {
// visit the url, and return the content of response
}
}

public class MyApp {
public void doSomething() {
String[] myarray = new String[]{ "aa","bb"};
Set<String> set = MyHelper.array2set(myarray);
String content = MyHelper.getContentOfUrl("http://google.com");
}
}

但是我的 friend 说我们应该避免定义这样的静态实用方法,因为我们直接在代码中调用它们,如果它们具有外部依赖性,将很难模拟它们或测试它们。他认为代码应该是:

public class ArrayHelper {
public Set<String> array2set(String[] items) { ... }
public List<String> array2list(String[] items) { ...}
}
public class UrlHelper {
public String getContentOfUrl(String url) {
// visit the url, and return the content of response
}
}

public class MyApp {
private final ArrayHelper arrayHelper;
private final UrlHelper urlHelper;
public MyApp(ArrayHelper arrayHelper, UrlHelper urlHelper) {
this.arrayHelper = arrayHelper;
this.urlHelper = urlHelper;
}
public void doSomething() {
String[] myarray = new String[]{ "aa","bb"};
Set<String> set = arrayHelper.array2set(myarray);
String content = urlHelper.getContentOfUrl("http://google.com");
}
}

这样,如果我们想为MyApp编写单元测试,我们可以模拟ArrayHelperUrlHelper并将它们传递给MyApp 的构造函数。

我完全同意他观点中关于 UrlHelper 的部分,因为原始静态代码使 MyApp 无法测试。

但是我对ArrayHelper 部分有点困惑,因为它不依赖于任何外部资源并且逻辑会非常简单。在这种情况下我们是否也应避免使用静态方法?

什么时候使用静态方法?还是尽可能避免使用它?


更新:

我们在开发中使用“TDD”,因此类的可测试性通常是我们最关心的问题。

我只是在第一句中将“功能性”一词替换为“无状态”,因为那是我真正的意思。

最佳答案

您可能永远不想模拟将数组转换为列表(或集合)的方法,并且此方法不需要任何状态并且不依赖于任何环境,因此静态方法看起来很好我。

就像标准的 Arrays.asList()(您可能应该使用它)。

另一方面,访问外部 URL 通常是您希望能够轻松模拟的事情,因为不模拟它会

  • 使测试成为集成测试
  • 要求每次运行测试时都启用此外部 URL,但您可能无法保证这一点
  • 要求此外部 URL 准确返回您希望它在测试中返回的内容(如果您想测试错误事件,则包括错误)。

关于java - 为了更好的可测试性,我们是否应该避免在 Java 代码中编写静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20163665/

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