我有一个用来交换两个变量的方法的类。它不返回任何内容。
public void swap(int a, int b) {
a ^= b;
b = a ^ b;
a = a ^ b;
}
如何使用JUnit进行测试?它甚至不会引起任何副作用。
发布于 2015-07-06 22:33:38
没有什么可测试的。
该方法什么也不做:它返回void
,并且没有副作用(没有突变,...)。
发布于 2015-07-06 22:33:29
您的方法不只是不返回任何内容,它什么也不做,至少在可观察到的副作用方面是这样。
如果你想让你的方法变得有用,你需要改变它来做一些你可以观察到的事情。例如,您可以将其更改为接受单元素数组参数:
public void swap(int[] a, int[] b) {
a[0] ^= b[0];
b[0] = a[0] ^ b[0];
a[0] = a[0] ^ b[0];
}
发布于 2015-07-06 23:16:00
您编写的函数不会对'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()来测试a1和b1中的值(如果它们被交换)。
//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[]为空时,您也可以编写测试用例。希望这能有所帮助。
https://stackoverflow.com/questions/31256758
复制相似问题