当前位置: 首页 > 知识库问答 >
问题:

Groovy Spock单元测试抛出NullPointerException,因为mock对象为null

夏知
2023-03-14

我正在为一个处理订单和设置完成的订单准备发货的类编写一些测试。为客户检索订单,并使用已完成订单的订单状态来完成处理。然而,当我运行测试时,它们失败了,说“不能在空对象上获得completedLines...”从错误中可以清楚地看出OrderStatus对象为NULL。但是,我在创建测试时设置了它,如下所示

ordersService.getStatus(orders) >> orderStatus

   OrdersService ordersService
   DiscountService discountService
   ShippingService shippingService


  Order getCustomerOrder(Long customerId) {
    List<Order> orders = 
          ordersService.retrieveOrderWithDiscount(customerId);
    List<LoyaltyDiscount> discounts = 
        discountService.getDiscounts(customerId,orders);
    OrderStatus orderStatus = ordersService.getStatus(orders);

  shippingService.processCompletedOrders(orderStatus.completedLines,orders);

    }



 class OrderSpecification extends Specification {
    OrdersService ordersService
    DiscountService discountService
    ShippingService shippingService

   def setup(){
     ordersService = Mock(OrdersService)
     discountService=  Mock(DiscountService)
     shippingService = Mock(ShippingService)
   }

   def 'completed orders with discounts should be shipped' (){
      given:
        long id =12334
        List <Order> orders = .. createOrders()
        OrderStatus orderStatus = createOrderStatus()
        ordersService.retrieveOrderWithDiscount(12345) >> orders
        ordersService.getStatus(orders) >> orderStatus
        shippingService.processCompletedOrders(orderStatus.completedLines,orders)
     ... rest omitted
   }

 }

共有1个答案

羊舌迪
2023-03-14

我想通了,这次测试没有失败,另一次是。

 类似资料:
  • 我有一段类似这样的代码: 我的测试是: 上面的代码不应该抛出NPE吗? 当我将测试更改为: 然后我的代码正确地抛出了一个空指针异常。 我的测试第一版和第二版有什么区别? 在我的第一个版本中,我告诉mockA返回mockB。但是我也将mockB设置为null,所以当调用b.doSomething()时,我认为该方法应该抛出一个空指针,因为它试图调用null.doSomething()。 我知道我应该

  • 我目前正在与CDI Unit合作一个项目,我遇到了一个奇怪的问题。我试图在一个简单的项目中重现它: 我有一个使用CdiRunner运行的测试类(如下所述:http://jglue.org/cdi-unit-user-guide/我的测试类注入了被测试的单元:UUD。这个类扩展了一个超级类“ParentTestClass”,它目前是无用的。 测试课。爪哇: 正如我提到的,父类是空的。 ParentT

  • 我的“BBService”对象在这里为空 我是不是漏掉了什么?

  • 问题内容: 根据文档,该方法返回: 如果参数是,则字符串等于; 否则,返回的值。 但是,当我尝试这样做时,怎么会这样: 它会抛出NPE吗?(如果你不相信,请自己尝试!) 怎么会这样呢?文件在骗我吗?这是Java中的主要错误吗? 问题答案: 问题是方法已重载: String.valueOf(Object) String.valueOf(char[]) Java规范语言要求在这种情况下,选择最具体的重

  • 引发异常 java.lang.RuntimeException:Android.text.SpannableStringInternal中的方法长度未被模拟。有关详细信息,请参见http://g.co/androidstudio/not-mocked。 这在上面的链接中解释为 我想学习,所以我准备在问答式下面加上我的答案。

  • 问题内容: 以下代码抛出: 因为它是静态的,所以我的编译器是否调用null?那没有任何意义! 发生了什么? 问题答案: 这里有两个问题在起作用: 不按照你的想法去做 在这种情况下返回 从到的分配会导致自动取消装箱 由于是被抛出 要解析,你可以使用例如。