Ложные занятия с чертами - PullRequest
2 голосов
/ 02 октября 2011

Существует ли какая-либо библиотека, которая предоставляет инструменты для насмешки над классами с чертами (обе могут быть statefull)?

Упрощенный пример:

trait T {
  var xx: List[Int] = List[Int]()
  def t(x: Int) {
    xx ::= x    //throws NPE, xx == null, even after implicit initialization
  }
}

class A extends T {
}

class Testable(a: A) {
  def bar() {
    a.t(2)
  }
}

@Test def testFoo() {
  val a: A = mock[A]
  val testable = new Testable(a)
  testable.bar()
  verify(a).t(2)
}

Ответы [ 3 ]

5 голосов
/ 02 октября 2011

Пол Батчер работал над Borachio, библиотекой насмешек Scala.Он поддерживает насмешки черт, классов, функций и объектов.См. Следующие блоги для получения дополнительной информации:

http://www.paulbutcher.com/2011/02/announcing-borachio-native-scala-mocking/ http://www.paulbutcher.com/2011/07/power-mocking-in-scala-with-borachio/

2 голосов
/ 02 октября 2011

Ну ... у меня нет ответа, но я думаю, что могу подсказать, откуда возникла проблема.Я взглянул на A.class и обнаружил, что (de.schauderhaft.testen - это пакет, который я использовал):

  // Method descriptor #21 (I)V
  // Stack: 2, Locals: 2
  public bridge void t(int x);
    0  aload_0 [this]
    1  iload_1 [x]
    2  invokestatic de.schauderhaft.testen.T$class.t(de.schauderhaft.testen.T, int) : void [26]
    5  return
      Line numbers:
        [pc: 0, line: 13]
      Local variable table:
        [pc: 0, pc: 6] local: this index: 0 type: de.schauderhaft.testen.A
        [pc: 0, pc: 6] local: x index: 1 type: int 

Я не эксперт по байт-коду, но это

2  invokestatic de.schauderhaft.testen.T$class.t(de.schauderhaft.testen.T, int) : void [26]

похоже, что вызов t (Int) на самом деле является вызовом статического метода, и вы не можете имитировать статические методы.PowerMock поможет, но, вероятно, уродлив в использовании.

1 голос
/ 07 ноября 2011

Я только что выпустил ScalaMock 2.0.Помимо функций и интерфейсов, ScalaMock может макетировать:

  • Классы
  • Одиночные и сопутствующие объекты (статические методы)
  • Создание объектов (вызов конструктора)
  • Классы с частными конструкторами
  • Конечные классы и классы с конечными методами
  • Операторы (методы с символическими именами)
  • Перегруженные методы
...