издевательский метод внутри другого метода scala

У меня возникла проблема при насмешке над методом, который вызывается в другом методе.

Например: Ниже в моем основном классе.

class Trial extends TrialTrait {

  def run(): String ={
    val a = createA()
    val b = a.split(" ")
    val c = b.size
    val d = c + " words are there"
    d
  }

  def createA(): String = {
    var a = "above all the things that have been done, one thing remained in silent above all the things that have been done one thing remained in silent above all the that "
    a
  }
}

Ниже мой фиктивный код.

class TryMock4 extends FunSuite with BeforeAndAfterEach with MockFactory {

  val trial = new Trial
  val st = stub[TrialTrait]

  test("Mocking the DataFrame") {
    val input = "above all the things that have been done, one thing remained in silent above "
    (st.createA  _).when().returns(input)
    val expected = "14 words are there"
    val actual = st.run()
    Assert.assertEquals(expected,actual)
  }
}

Что я пытаюсь сделать, так это передать фиктивные данные createA и использовать их в методе run.

Но он дает значение null после запуска метода run.

Не могли бы вы подсказать, как этого можно добиться?


person Aswanikumar    schedule 22.01.2019    source источник
comment
Я не думаю, что вы можете сделать это со ScalaMock. Но вы можете сделать это с помощью Mockito, используя spy. Но на самом деле тот факт, что вам нужно имитировать внутренний метод для тестирования, является признаком какого-то неправильного дизайна. Поэтому я настоятельно рекомендую сначала подумать о рефакторинге вашего кода.   -  person SergGr    schedule 23.01.2019
comment
Спасибо за ответ @SergGr. Не могли бы вы сообщить мне, как мы можем сделать это с помощью Mockito, используя шпиона. Я был бы признателен, если бы вы могли предоставить пример кода.   -  person Aswanikumar    schedule 23.01.2019
comment
Aswanikumar, вы читали документацию, на которую я ссылался (вторая ссылка)? Вы пробовали это? В чем именно ваша проблема с spy?   -  person SergGr    schedule 23.01.2019


Ответы (1)


Я не думаю, что в этом случае вам нужен макет, достаточно обычного переопределения.

class TrialTest extends FlatSpec with Matchers {
  behavior of "Trial"

  it should "count words" in {
    val input = "above all the things that have been done, one thing remained in silent above "

    val trial = new Trial {
      override def createA(): String = input
    }

    val expected = "14 words are there"
    val actual = trial.run()
    actual should be (expected)
  }
}

Однако, если вы действительно хотите использовать макет здесь, это возможно с scalamock. Вы можете определить наш собственный класс, который сделает часть класса final (та часть, которую вы не хотите имитировать), см. ниже:

class TrialTestWithMock extends FlatSpec with Matchers with MockFactory {
  behavior of "Trial"

  it should "count words" in {
    val input = "above all the things that have been done, one thing remained in silent above "

    class FinalTrial extends Trial {
      final override def run(): String = super.run()
    }

    val trial = mock[FinalTrial]

    (trial.createA _).expects().returning(input).anyNumberOfTimes()
    val expected = "14 words are there"
    val actual = trial.run()
    actual should be (expected)
  }
}
person Philipp    schedule 23.01.2019