使用JUnit assertArrayEquals测试maxRowAbsSum方法时出错,请求排查修正
问题排查与代码修复
先看看你这段代码里的几个明显问题,这肯定是导致JUnit测试失败的关键原因:
核心问题列表
- 完全忽略方法参数:你的方法接收了
int[][] array参数,但整个逻辑里根本没用到它,反而硬编码了一个maxRowValue数组。这意味着不管你测试时传入什么测试用例,方法都只会处理这个固定数组,测试肯定通不过。 - 代码逻辑不完整:在
if (totalOfRow > maxRow)的代码块里只写了maxR...,明显没写完——你需要在这里更新记录的最大绝对值和maxRow,以及对应的行索引indexofMaxRow。 - 绝对值计算冗余且易出错:你通过判断元素正负来累加绝对值,其实用
Math.abs()方法可以一步到位,代码更简洁,还能避免手动判断可能出现的逻辑错误。 - 返回值与测试不匹配:你的方法声明返回
int,但你用assertArrayEquals来测试——这个断言是用来比较数组的,说明你的测试期望方法返回一个数组(比如绝对值和最大的那一行),所以方法的返回类型可能需要调整为int[]。
修复后的完整代码
假设你的需求是:接收一个二维数组,计算每一行的元素绝对值之和,返回绝对值和最大的那一行数组。修复后的代码如下:
public static int[] maxRowAbsSum(int[][] array) { // 处理空数组或空行的边界情况 if (array == null || array.length == 0) { return new int[0]; } int maxAbsSum = 0; int indexOfMaxRow = 0; for (int row = 0; row < array.length; row++) { int currentRowAbsSum = 0; // 处理行为空的情况 if (array[row] == null) { continue; } for (int column = 0; column < array[row].length; column++) { // 用Math.abs直接计算绝对值,简洁可靠 currentRowAbsSum += Math.abs(array[row][column]); } // 更新最大绝对值和及对应的行索引 if (currentRowAbsSum > maxAbsSum) { maxAbsSum = currentRowAbsSum; indexOfMaxRow = row; } } // 返回绝对值和最大的那一行 return array[indexOfMaxRow]; }
如果你的需求是返回最大的绝对值和(而不是行数组),那方法返回类型保持int,最后返回maxAbsSum即可,同时测试时要改用assertEquals而不是assertArrayEquals。
对应的JUnit测试示例
比如测试你原来的硬编码数组,测试代码可以这样写:
import org.junit.Test; import static org.junit.Assert.assertArrayEquals; public class ArrayTest { @Test public void testMaxRowAbsSum() { int[][] testArray = { {3, -1, 4, 0}, {5, 9, -2, 6}, {5, 3, 7, -8} }; // 计算各行绝对值和:8, 22, 23 → 第三行是最大的 int[] expected = {5, 3, 7, -8}; int[] actual = YourClassName.maxRowAbsSum(testArray); assertArrayEquals(expected, actual); } }
额外说明
- 我添加了对空数组、空行的边界处理,避免出现
NullPointerException,让方法更健壮。 - 用
Math.abs()简化了绝对值计算,减少了出错概率。 - 确保方法使用传入的
array参数,而不是硬编码的内部数组,这样测试用例才能生效。
内容的提问来源于stack exchange,提问作者LtMuffin
相关产品推荐
相关产品推荐

