你们如何创建utils类?有标准的方法吗?
就像标题所说,你可以有类似的东西:
public class Utils {
public static method1(){...}
public static method2(){...}
...
}
并通过调用Utils.method1()
来使用它,但是这样,当您为使用此utils类的类编写单元测试时,您可以模拟静态方法,因此如果它们有错误,则单元测试将失败。 / p>
或者,您可以将utils类的实例提供给在其构造函数中使用它的类,这样您就可以在单元测试中模拟它,但是看起来非常笨拙,为每个使用它的类提供一个utils类的实例,总的来说(至少对我而言看起来很尴尬)。
我的意思是,如果我们有A类使用Utils类中我们可以做的方法:A a = new A(new Utils());
有没有办法实现两者兼而有之?或者至少是行业标准的东西?还是另一种我没想到的方式?
答案 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的一部分并经过充分测试。如果你开始考虑在该级别上依赖注入和模拟,那么你已经输了。应该非常小心地进行模拟。
备选方案: