【问题标题】:Testing method for swapping two variables with JUnit用 JUnit 交换两个变量的测试方法
【发布时间】:2015-07-06 22:29:29
【问题描述】:

我有一个带有交换两个变量方法的类。它什么也不返回。

public void swap(int a, int b) {
    a ^= b;
    b = a ^ b;
    a = a ^ b;
}

如何使用 JUnit 对其进行测试?它甚至不会引起任何副作用。

【问题讨论】:

  • 这个方法应该怎么做(可能是题外话)?
  • 如果什么都不返回,也没有副作用,那就没什么可测试的了……

标签: java testing methods junit swap


【解决方案1】:

没有什么要测试的。

方法什么都不做:它返回void,并且没有副作用(没有突变,...)。

【讨论】:

    【解决方案2】:

    您的方法不仅没有返回任何内容,它什么也没有,至少在可观察到的副作用方面。

    如果你想让你的方法以任何方式有用,你需要改变它来做一些你可以观察到的事情。例如,您可以将其更改为接受单元素数组参数:

    public void swap(int[] a, int[] b) {
        a[0] ^= b[0];
        b[0] = a[0] ^ b[0];
        a[0] = a[0] ^ b[0];
    }
    

    【讨论】:

      【解决方案3】:

      您编写的函数不会对 'a' 和 'b' 的值执行任何交换,因为在 java 中,原始类型的值是按值传递的。

      public void swap(int a, int b) {
          a ^= b;
          b = a ^ b;
          a = a ^ b;
      }
      

      通过将值放入长度为 1 的数组然后执行交换操作所建议的功能将作为数组传递引用。

      public void swap(int[] a, int[] b) {
          a[0] ^= b[0];
          b[0] = a[0] ^ b[0];
          a[0] = a[0] ^ b[0];
      }
      

      但是,如果数组 a 和 b 都引用同一个数组,则该函数将失败。上述函数将使作为两个参数的参数传递的数组的第零个元素为零。所以我们需要把上面的函数改成如下方式:-

      public void swap(int[] a, int[] b) {
          if (a == b) { //do not swap 
              return;
          }
      
          if (a ==null) {
              return;
          }
      
          if (b ==null) {
              return;
          }
      
          a[0] ^= b[0];
          b[0] = a[0] ^ b[0];
          a[0] = a[0] ^ b[0];
      }
      

      我将为上述代码推荐一些 Junit 测试用例。您可以使用 JUnit 包中的 assertEquals() 来测试 a[1] 和 b[1] 中的值是否被交换。

      //both a[0] and b[0] are different values
      int[] a = {4};
      int[] b = {5};
      
      int copy_a = a[0];
      int copy_b = b[0];
      
      swap(a, b);
      
      assertEquals("copy_a should be b[0]", copy_a, b[0]);
      assertEquals("copy_b should be a[0]", copy_b, a[0]);
      
      //both a[0] and b[0] are same values
      a[0] = 4;
      b[0] = 4;
      
      copy_a = a[0];
      copy_b = b[0];
      
      swap(a, b);
      
      assertEquals("copy_a should be copy_b", copy_a == copy_b, a[0] == b[0]);
      
      //case when you pass same array as both arguments.
      
      a[0] = 9;
      copy_a = a[0];
      swap(a, a);
      assertEquals("copy_a should be a[0]", copy_a, a[0]);
      

      除了上面推荐的测试用例,你还可以在 a[] 或 b[] 中的任何一个为空时编写测试用例。希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2019-10-20
        • 2020-11-23
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多