【发布时间】:2015-12-01 16:26:00
【问题描述】:
您如何协调使用静态工厂方法和模拟?
很多人会说:不要使用静态工厂方法,而是使用 DI。
嗯,有时你无法避免静态工厂方法。考虑以下应该熟悉的用例:
假设您有一个名为 Option 的类,就像在 scala 中一样。如果您想为所有不存在的值重用相同的实例,则无法避免使用静态工厂方法。
只要你去new Option(null)你创建一个新的选项对象,你不能一遍又一遍地返回相同的对象。
类似的用例是Integer.valueOf(),它将为低于 128 的值重用整数对象。不使用静态工厂方法是不可能的。
另一个优点是工厂方法比new关键字更具描述性。
那么你们如何处理必须使用静态工厂方法同时又想使用继承和模拟的问题?
谢谢。
【问题讨论】:
-
你为什么需要
mockOption?static此类琐碎类的工厂方法很好。 -
这里特意提到了 Scala 的
Option作为例子,这很有趣,因为Scala 没有static成员的概念。Option.apply()是普通(实例)对象上的实例(非静态)方法。在 JVM 上,该实例对象存储在静态字段Option.MODULE中,因此调用Option(1)实际上会扩展为类似于Option.MODULE.apply(1)的内容。这与System.out.println()非常相似,其中out也是一个静态字段,但您可以通过System.setOut()进行更改。换句话说,您没有必须对任何事情使用静态方法...
标签: java unit-testing testing tdd