У меня есть функция, которую я хотел бы проверить, что делает хэш на строке, а затем изменяет хэш и использует результат определенным образом. Я хотел бы написать тесты для этого метода, используя строки, имеющие особые хэш-коды. Моя первая попытка получить эту работу было переопределить метод 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
).
Итак, мой вопрос в том, есть ли другой способ сделать это? Эти варианты я могу думать:
Просто возьмите некоторые строки, положить их (по умолчанию) хэш-коды в комментарии в тесте, и использовать их.
Изменение интерфейса для метода (который в настоящее время является
def useHash(s: String): Int
) к чему-то, что позволит мне обеспечить строку с перекрываться хэш-код, как некоторые, сделав новый тип, который связан сString
.(Возможно, это то же самое, что и (2)) Используйте какое-то неявное преобразование в коде реализации, или возьмите в качестве второго аргумента функцию, которая вычисляет хэш (по умолчанию используется только вызов
s.hashCode
).
Мое желание использовать метод (1). Я не хочу, чтобы код реализации был более сложным, чтобы я мог проверить его немного более причудливым образом. Но я задавался вопросом, есть ли какой-то способ использования scala foo, о котором я не знаю, что позволит мне легко указать конкретные хеш-коды в моем тесте, не усложняя мой код реализации.