2011-06-15 92 views
3

您会如何比较Scala的对象可测试性与Java中的静态测试?任何陷阱和陷阱?测试Scala对象

谢谢。

回答

9

与Java中的静态相同 - 为了测试目的,对象引用很难交换,因此除了无副作用的无状态实用方法(例如Math.min,Math.max)之外,您通常希望避免它们。就像Java静态一样,持有状态的对象使得测试特别困难。

尽管Scala对象比Java静态有一个优点,您可以让对象扩展一些超类型并通过该接口引用。然后,你可以注入该对象到您的客户端类的构造函数,所以你的客户得到更多的可测试:

object MyRunnable extends Runnable { 
    def run() { } 
} 

class Client(r: Runnable) { 
    // .. 
} 

new Client(MyRunnable) 
new Client(mock[Runnable]) // you can substitute the object with a mock for tests 

用普通的Java静态的,那是不可能的。你可以用Java中的单例做类似的事情(与Scala对象相似)。

3

通常,使用'object'类声明的Scala单例实例比Java静态方法更适合测试,主要是因为它们能够实现特征并扩展其他类,因此适合典型的面向对象测试范例。

现在,如果您碰巧在单例对象中做了一些不幸的事情,比如存储可变状态,您将遇到与测试Java单例时相同的各种问题。当然,有一个简单的解决方案:永远不要在对象的主体中使用“var”。这是“绝不使用var,period”的高级建议的一个微不足道的专业化。