【问题标题】:Scala does not throw Exception while testingScala 在测试时不会抛出异常
【发布时间】:2020-02-05 09:48:32
【问题描述】:

我无法在 Scala 测试中模拟抛出异常。得到错误:预期的异常 java.lang.Exception 被抛出,但没有抛出异常

test("test with Exception"){
   val generatorService=mock[GeneratorService]
   val entityProviderRequest=new EntityProviderRequest(entity:Entity)
   when(generatorService.generateVertex(entityProviderRequest.entity, "abc")).thenThrow(new RuntimeException)
   intercept[Exception]{
     generatorService.generateElements(entityProviderRequest, "abc")
   }
}

【问题讨论】:

    标签: scala mockito scalatest


    【解决方案1】:

    你在intercept里面调用的方法和你上面定义的不一样。这就是为什么它不会抛出异常。当行为未定义时,模拟对象仅返回null。下面的测试应该会成功。

    test("test with Exception"){
       val generatorService = mock[GeneratorService]
       val entityProviderRequest = new EntityProviderRequest(entity)
       when(generatorService.generateElements(entityProviderRequest, "abc"))
         .thenThrow(new RuntimeException)
    
       intercept[Exception]{
         generatorService.generateElements(entityProviderRequest, "abc")
       }
    }
    

    更新

    如果你想使用一个方法的真实实现,但是mock其他的,你可以使用when(..).thenCallRealMethod()来实现它:

    test("test with Exception"){
       val generatorService = mock[GeneratorService]
       val entityProviderRequest = new EntityProviderRequest(entity)
    
       when(generatorService.generateElements(entityProviderRequest, "abc"))
         .thenCallRealMethod()
       when(generatorService.generateVertex(entityProviderRequest.entity, "abc"))
         .thenThrow(new RuntimeException)
    
    
       intercept[Exception]{
         generatorService.generateElements(entityProviderRequest, "abc")
       }
    }
    

    【讨论】:

    • 其实 generateVertex(entityProviderRequest.entity, "abc") 是从 generateElements(entityProviderRequest, "abc") 内部调用的,这种情况下如何抛出异常?
    • 啊,好吧,通常当你模拟一个类时,这意味着你用模拟实例替换了它的整个实现,所以你调用 generateVertexgenerateElements 实现被完全替换了,但是你可以明确告诉 mockito 使用 generateElements 的真实实现,请查看更新后的答案
    猜你喜欢
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 2020-08-18
    • 2014-05-10
    • 2013-12-05
    • 2023-01-25
    相关资源
    最近更新 更多