Как я могу протестировать метод, который вызывает error() с помощью spec2?

Я хотел бы проверить метод, который вызывает в нем error().

IntEmptyStack.top это то, что я хочу протестировать с помощью spec2:

abstract class IntStack {
  def push(x: Int): IntStack = new IntNonEmptyStack(x, this)
  def isEmpty: Boolean
  def top: Int
  def pop: IntStack
}
class IntEmptyStack extends IntStack {
  def isEmpty = true
  def top = error("EmptyStack.top")
  def pop = error("EmptyStack.pop")
}

И вот спецификации, которые я написал до сих пор:

import org.junit.runner.RunWith
import org.specs2.runner.JUnitRunner
import org.specs2.mutable.Specification

@RunWith(classOf[JUnitRunner])
class IntStackSpec extends Specification {

  "IntEmptyStack" should {
    val s = new IntEmptyStack
    "be empty" in {
      s.isEmpty must equalTo(true)
    }
    "raise error when top called" in {
      s.top must throwA[RuntimeException]
    }
  }
}

Ошибка возникает в строке 13, "raise error when top called" in {. Сообщение об ошибке: value must is not a member of Nothing. Я думаю, что Scala выводит s.top как Nothing, а не Int, как определено в абстрактном классе. Как в таком случае написать тест без ошибок?

Спасибо за любые комментарии/исправления к этому вопросу.

Ссылка на пример: Scala By Example


person philipjkim    schedule 22.06.2012    source источник


Ответы (1)


Проблема здесь в том, что scala (и Java) позволяют подклассам возвращать более конкретные типы, чем суперклассы в переопределенных методах. В этом случае возвращаемый тип вашего метода IntEmptyStack.topNothing (который является подтипом Int, поскольку Nothing находится в нижней части иерархии типов.

Очевидно, что неявные преобразования спецификации, необходимые для написания кода, подобного a must throwA[X], не применяются, когда тип a равен Nothing.

Измените свои объявления в IntEmptyStack следующим образом:

def top: Int = error("EmptyStack.top")
def pop: Int = error("EmptyStack.pop")

В качестве альтернативы, конечно, вы можете допустить тот факт, что правильность вашей логики доказывается системой типов. То есть невозможно получить элемент, находящийся на вершине пустого стека: тип возвращаемого значения — Nothing! Тесты не нужны.

person oxbow_lakes    schedule 22.06.2012