【问题标题】:Overriding a method which returns Unit while writing unit test cases [duplicate]在编写单元测试用例时覆盖返回 Unit 的方法 [重复]
【发布时间】:2016-04-27 07:21:29
【问题描述】:

我正在使用 MockitoSugar 编写单元测试用例。

这是我的示例代码:

class EmployeeRepo {

  def addEmplyees(emp:Employee): Long = {
    //logic
    val res1 = sendReport
    val res2 = sendNotification
    //logic
  }

  def sendReport:Boolean={
    //logic
  }

  def sendNotification:Unit={
    //logic
  }
}

示例测试用例:

class TestEmployeeRepo extends WordSpec with MockitoSugar with ScalaFutures {
  "TestEmployeeRepo" must {
    "add employee" in {
      //mock statements
      val result = MockEmployeeRepo.addEmplyees(emp)
      //assert statements
    }
  }
} 

object MockEmployeeRepo extends EmployeeRepo {
  override def sendReport:Boolean = true   
  override def sendNotification:Unit = //needs unit
}

在上面的代码中,我试图用必要的模拟来测试addEmployee 方法。所以在覆盖 sendNotificationwhich 实际上返回 Unit 时,我不确定我应该如何返回 Unit

我尝试了这两种方法:

override def sendNotification:Unit = println("")

override def sendNotification:Unit = Unit

工作正常,但请建议我正确的方法以及//needs unit 应该有什么。提前致谢。

【问题讨论】:

    标签: scala unit-testing mockito


    【解决方案1】:

    你可以使用(),这是Unit类型的字面值。

    override def sendNotification: Unit = ()
    

    【讨论】:

      【解决方案2】:

      您可以返回一个空块或单元 () 的文字符号(又名空元组)

      override def sendNotification:Unit = {}
      override def sendNotification:Unit = ()
      

      如下所示,它们都代表文字()

      scala> import scala.reflect.runtime.universe._
      import scala.reflect.runtime.universe._
      
      scala> showRaw(reify(()))
      res0: String = Expr(Literal(Constant(())))
      
      scala> showRaw(reify({}))
      res1: String = Expr(Literal(Constant(())))
      

      根据 Łukasz 的评论,有一个区别:虽然 () 实际上代表 Unit 类型的 singleton,但空块被脱糖成仅包含 () 的块里面。

      更具体地说,编译器会自动将() 放在必须评估为Unit 的任何块的末尾。您已经在这里注意到了这一点:

      override def sendNotification:Unit = println("")
      

      【讨论】:

      • 我不会说空块代表() 我的意思是实际上它是相同的,但从概念上讲()Unit 类型的唯一值,编译器会自动将它放在末尾应该被评估为类型Unit的块。 def a: Unit = {println(1); 2 + 2 } 将被转换为 def a: Unit = {println(1); 2 + 2; () }。我只是想为 OP 澄清一下,使 {}() 等效并没有什么魔力。只是在这种特定情况下执行此操作的一般规则。
      • 你说得对,我一会儿再完善我的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 2011-03-28
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多