Тестирование объектов Scala - PullRequest
3 голосов
/ 15 июня 2011

Как бы вы сравнили тестируемость объектов Scala с тестированием статики в Java?Есть ли подводные камни и ловушки?

Спасибо.

Ответы [ 2 ]

9 голосов
/ 15 июня 2011

Так же, как статические в 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 голосов
/ 15 июня 2011

В общем случае одноэлементные экземпляры Scala, объявленные с помощью класса 'object', более пригодны для тестирования, чем статические методы Java, в основном потому, что они способны реализовывать признаки и расширять другие классы и, таким образом, вписываются в типичную объектно-ориентированную парадигму тестирования..

Теперь, если вам случится сделать что-то неудачное, например, сохранить изменяемое состояние в одноэлементном объекте, у вас возникнут те же проблемы, с которыми вы сталкиваетесь при тестировании синглетонов Java.Конечно, есть простое решение: никогда не используйте 'var' в теле объекта.Это тривиальная специализация высшего совета «никогда не используйте вар, точка».

...