【问题标题】:Swap number test case in spock在 spock 中交换号码测试用例
【发布时间】:2021-08-09 12:54:59
【问题描述】:

我只是在尝试使用 Spock 测试框架,根据文档,它看起来比 JUnit 更好,并尝试编写简单的测试用例,但不知何故它不起作用。

类:

public class SwapTwoNumber {
    public void swapNumber(int a,int b){
        a =a+b;
        b=a-b;
        a=a-b;

    }
}

Spock 测试 Groovy:

import spock.lang.Specification

class SwapTwoNumberTest extends Specification{
    def "swap to number as given. #a and #b"() {
     given:
      int a = 5
      int b = 6
     when:
      SwapTwoNumber sw =Mock()
      sw.swapNumber(a,b)
      then:
      a==6
      b==5

    }
}

【问题讨论】:

  • “它不工作”是什么样的?
  • 请注意,Java 是按值调用的,因此将ab 传递给swapNumber 实际上不会对调用者执行任何可见的操作。 a 仍为 5,b 仍为 6。您需要将引用(也是一种值)传递给可变容器,例如AtomicInteger(作为一个简单的例子,它不是该类存在的实际用例)然后在这些上调用set(...)
  • 您对Mock() 的呼叫是否正确?你不应该嘲笑你正在测试的东西(更不用说你的代码很简单,没有必要模拟任何东西)
  • 同意@mattfreake,但托马斯正确地指出了实施。
  • 这段代码在很多层面上都是错误的,我几乎不知道从哪里开始:交换动作是神秘的,只是为了保存一个临时变量。您认为您将在这里优化什么?然后你模拟被测类,让swapNumber 什么都不做!您不了解 intInteger 这样的原始类型或不可变类型。您使用void 方法,其唯一的副作用是修改内部状态(这适用于对象类型,不适用于原语或其不可变的包装类)。只需先学习编程基础知识,然后再专注于测试。

标签: java spock


【解决方案1】:

我不熟悉您提到的测试框架,但这很可能不是框架问题。您正在传递原始参数。

docs中所述

原始参数,例如 int 或 double,按值传递给方法。这意味着对参数值的任何更改仅存在于方法的范围内。当方法返回时,参数消失了,对它们的任何更改都将丢失。

【讨论】:

    猜你喜欢
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多