Как издеваться над методом в расширенном трейте с помощью Mockito

Как я могу издеваться над зависимыми чертами с помощью mockito? У меня две черты характера:

 trait A {
    def a = 1
  }

  trait B extends A {
    def b = {
      // do things
      a
      // do things
    }
  }

Теперь я хочу протестировать Черту Б. И я хочу убедиться, что вызывается A.a ():

class SmallTest extends FunSuite with MockitoSugar {
  test("prove, that a gets called") {
    val mockA = mock[A]
    val b = new B with mockA {}  // This won't compile
    b.b
    verify(mockA).a
  }
}

Этот пример не компилируется. Но как я мог бы «внедрить» свой макет в противном случае?


person gun    schedule 20.08.2015    source источник


Ответы (2)


Использование шпиона было бы лучшим выбором. mockito spy

// the class being spied cannot be final,
// so we cannot do this:
// spy(new B {})

class C extends B

val c = spy(new C)
c.b
verify(c).a
person thirstycrow    schedule 20.08.2015
comment
У меня такие же вопрос. Проблема со Spys в том, что они по-прежнему вызывают реальный код, что я не хочу делать в этом случае, потому что метод, который я хочу проверить, взаимодействует с базой данных. - person moncheery; 16.11.2015

Хорошо, нашел способ. Это сработает. Может быть, немного неудобно, если есть много методов, я должен переопределить ... В этом примере я добавил параметры метода к методу, который хочу имитировать, чтобы показать повторение, что выглядит не очень красиво.

  trait A {
    def a(i: Int) = i + 1
  }

  trait B extends A {
    def b(j: Int) = {
      // do things
      a(j)
      // do things
    }
  }

  test("prove, that a gets called") {
    val mockA = mock[A]
    val b = new B {
      override def a(j: Int) = mockA.a(j)
    }
    b.b(1)
    verify(mockA).a(1)
  }
person gun    schedule 20.08.2015