使用JUnit交换两个变量的测试方法

时间:2015-07-06 22:29:29

标签: java testing methods junit swap

我有一个类,用于交换两个变量的方法。它什么都不返回。

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

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

3 个答案:

答案 0 :(得分:2)

无需测试。

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

答案 1 :(得分:1)

你的方法不会什么都不返回,没有什么,至少在可观察到的副作用方面。

如果您想以任何方式使您的方法有用,您需要更改它以执行您可以观察到的事情。例如,您可以将其更改为接受单元素数组参数:

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

答案 2 :(得分:0)

您编写的函数不会对'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都引用相同的数组,则该函数将失败。上面的函数将使第0个元素为零,这个数组作为两个参数的参数传递。所以我们需要以下列方式更改上述功能: -

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()来测试[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]);

除了上面提出的测试用例之外,当[]或b []中的任何一个为空时,您也可以编写测试用例。希望这会有所帮助。