我有一个类,用于交换两个变量的方法。它什么都不返回。
public void swap(int a, int b) {
a ^= b;
b = a ^ b;
a = a ^ b;
}
如何使用JUnit进行测试?它甚至不会引起任何副作用。
答案 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 []中的任何一个为空时,您也可以编写测试用例。希望这会有所帮助。