Как пройти урок скалы в макете - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть класс scala A и в нем есть метод doSomething.

Есть еще один класс B

  class B(name: String)

есть еще один класс C

class C {
 def doSomethingElse(b: B): String { 
 /// some logic 

 ////

 }
} 


 class A(c: C) {
  def doSomething(uuid: UUID): String {
   val b = new B("hello)
   c.doSomethingElse(b)
   // some logic

 }

}

Теперь я хочу протестировать метод doSomething класса A с использованием scalatest иscalamock

и я попытался смоделировать вызов doSomethingElse

val mockC = mock[C] 
val b = new B("hello")
(mockC.doSomethingElse _).expects(b).returning("A");

, но когда происходит реальный вызов, имитация не выполняется, потому что объект B отличается.Есть ли способ выразить эту насмешку, чтобы она была удовлетворена?

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

Комментарий Тило прав: ваши два B будут сравниваться как ссылки выше, и, поскольку они не являются одним и тем же объектом, они не равны.Для равенства контента вам нужна соответствующая equals реализация.Вы получаете это бесплатно в Scala, если сделаете B a case class.Если вы не можете изменить класс B, тогда использование предиката в ScalaMock может помочь вам сравнить два экземпляра во время теста.Читайте об этом здесь: https://scalamock.org/user-guide/matching/

0 голосов
/ 29 сентября 2019

Вот примеры, предложенные @Thilo и @PhilippM:

Переопределение equals метода, подобного так

class B(val name: String) {
  override def equals(obj: Any): Boolean = obj match {
    case b: B => b.name == this.name
    case _ => false
  }
}

мы можем использовать обычные

(mockC.doSomethingElse _) expects(new B("hello")) returning("A")

илиесли мы не можем изменить B, тогда попробуйте сопоставить предикат , например

mockC.doSomethingElse _ expects where { (b: B) => b.name == new B("hello").name } returning "A"
...