2015-04-11 3 views
0

У меня есть функция, которую я хотел бы проверить, что делает хэш на строке, а затем изменяет хэш и использует результат определенным образом. Я хотел бы написать тесты для этого метода, используя строки, имеющие особые хэш-коды. Моя первая попытка получить эту работу было переопределить метод Hashcode в строке:Scala: переопределение hashCode String для теста

val testString = new String("test") { override def hashCode() = 3 } 
// use testString as input to the method I want to test 

Это было бы хорошо работали, кроме String является окончательным, поэтому он не компилируется (illegal inheritance from final class String).

Итак, мой вопрос в том, есть ли другой способ сделать это? Эти варианты я могу думать:

  1. Просто возьмите некоторые строки, положить их (по умолчанию) хэш-коды в комментарии в тесте, и использовать их.

  2. Изменение интерфейса для метода (который в настоящее время является def useHash(s: String): Int) к чему-то, что позволит мне обеспечить строку с перекрываться хэш-код, как некоторые, сделав новый тип, который связан с String.

  3. (Возможно, это то же самое, что и (2)) Используйте какое-то неявное преобразование в коде реализации, или возьмите в качестве второго аргумента функцию, которая вычисляет хэш (по умолчанию используется только вызов s.hashCode).

Мое желание использовать метод (1). Я не хочу, чтобы код реализации был более сложным, чтобы я мог проверить его немного более причудливым образом. Но я задавался вопросом, есть ли какой-то способ использования scala foo, о котором я не знаю, что позволит мне легко указать конкретные хеш-коды в моем тесте, не усложняя мой код реализации.

ответ

0

Вы можете попробовать шаблон TypeClass. Например:

trait Hasher[T] { 
    def hash(t: T): Int 
} 

object Hasher { 
    implicit val stringHasher = new Hasher[String] { 
    val mySpecialStrings = List("ein" -> 123123, "schwein" -> 432121, "dry" -> 948912).toMap 
    def hash(str: String) = mySpecialStrings.getOrElse(str, str.hashCode) 
    } 
} 

object MyStuff { 
    def methodUsingHasher[T](t: T)(implicit hasher: Hasher[T]) = ??? // do stuff 
} 
Смежные вопросы