Вы можете создать класс, который расширяет ваш исходный класс и переопределяет только те методы, которые вы хотите, например:
class DummyClass(x: Int) {
def doSomething(): String = "xyz"
def doSomethingElse(): Int = x * 2
}
class DummyClass2(x: Int) extends DummyClass(x) {
override def doSomething(): String = "abc"
}
val a = new DummyClass(3)
val b = new DummyClass2(3)
println(a.doSomething()) // xyz
println(a.doSomethingElse()) // 6
println(b.doSomething()) // abc
println(b.doSomethingElse()) // 6
( смотрите здесь в прямом эфире )
или:
class DummyClass(x: Int) {
def doSomething(): String = "xyz"
def doSomethingElse(): Int = x * 2
}
object DummyClass2 extends DummyClass(3) {
override def doSomething(): String = "abc"
}
val a = new DummyClass(3)
val b = DummyClass2
println(a.doSomething()) // xyz
println(a.doSomethingElse()) // 6
println(b.doSomething()) // abc
println(b.doSomethingElse()) // 6
( смотрите в прямом эфире здесь )
Это не идеально, хотя ... вы столкнулись с одной из основных проблем со случайным кодом- это сложно проверить. Одним из решений может быть помещение вашего генератора случайных чисел в новый класс / объект / что угодно и расширение / внедрение, чтобы вы могли переопределить его в тестах. Как то так:
import javax.inject.Inject
import scala.util.Random
class Generator {
def rand = Random.nextInt()
}
class Dummy @Inject()(num: Int, gen: Generator) {
def doSomething(): Int = num * gen.rand
}
// ---------------
// ACTUAL CODE
// ---------------
val generator = new Generator
val x = new Dummy(3, generator)
println(x.doSomething()) // something
println(x.doSomething()) // something different
// ---------------
// TEST CODE
// ---------------
val nonRandomGenerator = new Generator {
override def rand: Int = 4
}
val y = new Dummy(3, nonRandomGenerator)
println(y.doSomething()) // 12
println(y.doSomething()) // 12