Java utils类,静态方法vs注入utils类

时间:2018-04-21 19:55:08

标签: java oop

你们如何创建utils类?有标准的方法吗?

就像标题所说,你可以有类似的东西:

public class Utils {

   public static method1(){...}

   public static method2(){...}
...
}

并通过调用Utils.method1()来使用它,但是这样,当您为使用此utils类的类编写单元测试时,您可以模拟静态方法,因此如果它们有错误,则单元测试将失败。 / p>

或者,您可以将utils类的实例提供给在其构造函数中使用它的类,这样您就可以在单元测试中模拟它,但是看起来非常笨拙,为每个使用它的类提供一个utils类的实例,总的来说(至少对我而言看起来很尴尬)。 我的意思是,如果我们有A类使用Utils类中我们可以做的方法:A a = new A(new Utils());

有没有办法实现两者兼而有之?或者至少是行业标准的东西?还是另一种我没想到的方式?

3 个答案:

答案 0 :(得分:1)

您可以在测试中为使用if类的类模拟静态方法。假设您使用JUnit,您可以添加对powermock的依赖:

Utils

假设客户端类,例如:

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.7.4</version>
</dependency>

在ClientCode的测试中,您可以使用powermock:

class ClientCode {
    public void doSomething() {
        String value = Utils.method1();
    }
}

答案 1 :(得分:1)

通常,您可以(并且不必)为实用程序方法编写静态方法,您不需要模拟或切换到它们的不同实现。
某些处理可能不需要模拟或实现切换。所以让它们静态的实用方法是可以接受的 以数学函数为例,例如计算数字的平方根。您不应该嘲笑它或切换到另一个实现 因此,使用静态方法不应该导致任何问题。

如果您不知道是否需要模拟/切换到其他实现,我认为您应该更喜欢实例方法,因为它更灵活。

答案 2 :(得分:0)

实用程序类应该是API的一部分并经过充分测试。如果你开始考虑在该级别上依赖注入和模拟,那么你已经输了。应该非常小心地进行模拟。

备选方案:

  • 默认接口方法实现(自Java 8起)
  • 适配器,用于装饰类的实例并提供实用程序功能。