Невозможно смоделировать класс в scala при написании тестового класса с помощью ScalaTest

Я использую scala 2.11 с scalatest 2.11. Я пытаюсь издеваться над классом для модульного тестирования класса.

Класс Vector имеет метод vectorSum, который складывает 2 вектора и возвращает результирующий вектор.

Вектор.скала

package com.unitTestDemo

class Vector(d_x:Int,d_y:Int,d_z:Int) {
  var x = d_x
  var y = d_y
  var z = d_z

  def vectorSum(second:Vector): Vector = {
    var result = new Vector(0,0,0)
    result.x = x + second.x
    result.y = y + second.y
    result.z = z + second.z

    return result
  }
}

В классе VectorUtil есть метод findMaxVectorSum, который принимает массив векторов и возвращает пару индексов массива с наибольшей суммой. VectorUtil.scala

package com.unitTestDemo


class VectorUtil {

  def findMaxVectorSum(vectorArray:Array[Vector]): Unit ={

    var max = 0.0
    var returnI = 0
    var returnj = 0

    for(i <- 0 to vectorArray.length-2){
      for(j <- i+1 to vectorArray.length-1){
        var temp = vectorArray(i)vectorSum(vectorArray(j))
        var tempMax = math.sqrt(temp.x*temp.x + temp.y*temp.y + temp.z*temp.z)
        if(tempMax > max) {
          max = tempMax
          returnI = i
          returnj = j
        }
      }
    }

    return (returnI,returnj)
  }
}

В VectorUtilTest я пытаюсь смоделировать класс Vector и протестировать метод findMaxVectorSum.

VectorUtilTest.scala

package com.unitTestDemo

import org.mockito.ArgumentMatchers._
import org.mockito.Mockito
import org.mockito.Mockito.when
import org.mockito.MockitoSugar.verify
import org.scalatest.{FunSuite, Matchers}
import org.scalatest.mockito.MockitoSugar

class VectorUtilTest extends FunSuite with MockitoSugar with Matchers{

  test("testFindMaxVectorSum") {

    val vectorArray:Array[Vector] = new Array[Vector](3)

    vectorArray(0) = new Vector(1,2,3)
    vectorArray(1) = new Vector(2,3,4)
    vectorArray(2) = new Vector(3,4,5)

    val temp = new Vector(1,1,1)
    val mockVector = mock[Vector]
    when(mockVector.vectorSum(any[Vector])).thenReturn(temp)

    val vectorUtil = new VectorUtil()
    vectorUtil.findMaxVectorSum(vectorArray)

    verify(mockVector,Mockito.atLeastOnce).vectorSum(any[Vector])
  }
}

Но когда я запускаю этот тестовый метод, я получаю вывод следующим образом:

Wanted but not invoked:
vector.vectorSum(<any>);
-> at com.unitTestDemo.VectorUtilTest$$anonfun$1.apply(VectorUtilTest.scala:26)
Actually, there were zero interactions with this mock.

Я потратил слишком много времени на это, и теперь я очень расстроен. Может ли кто-нибудь помочь мне с этим?

Заранее большое спасибо.


person Rushi Doshi    schedule 20.09.2020    source источник


Ответы (1)


Проблема здесь, как описано в вашей ошибке, заключается в том, что mockVector.vectorSum не вызывался. При вызове:

verify(mockVector,Mockito.atLeastOnce).vectorSum(any[Vector])

Mockito ожидает найти вызов в фиктивном экземпляре. Как мы видим в вашем тестовом коде, фиктивный вектор не перешел к findMaxVectorSum, следовательно, не вызывал vectorSum. Я не уверен, что именно вы пытаетесь проверить здесь, но, возможно, вам следует добавить издевательский вектор в массив.

Например, проходной тест будет:

test("testFindMaxVectorSum") {

  val temp = new Vector(1,1,1)
  val mockVector = mock[Vector]
  when(mockVector.vectorSum(any[Vector])).thenReturn(temp)
  
  val vectorArray:Array[Vector] = new Array[Vector](4)

  vectorArray(0) = mockVector
  vectorArray(1) = new Vector(1,2,3)
  vectorArray(2) = new Vector(2,3,4)
  vectorArray(3) = new Vector(3,4,5)

  val vectorUtil = new VectorUtil()
  vectorUtil.findMaxVectorSum(vectorArray)

  verify(mockVector,Mockito.atLeastOnce).vectorSum(any[Vector])
}

Кроме того, вы, вероятно, захотите прочитать Когда можно использовать «var» в Scala? и Возврат в Scala

person Tomer Shetah    schedule 21.09.2020
comment
Это работает как шарм .... Большое спасибо !! Я просто пытался проверить функциональность издевательства, не более того. Но для меня это стало кошмаром. Хотел бы я угостить тебя. Будьте здоровы :) - person Rushi Doshi; 21.09.2020