【发布时间】:2015-04-30 11:48:34
【问题描述】:
我正在尝试找出为课堂练习实施测试用例的最佳方法。我的课堂练习提供了已知的错误,我应该为此编写一个测试用例以使其失败,从而找到错误。它涉及使用 Dijkstra 算法。
这是所提供代码的正确版本:
private int getNodeWithMinimumDistanceFromUnsettled()
{
int min;
int node = 0;
Iterator<Integer> iterator = unsettled.iterator();
node = iterator.next();
min = distances[node];
for (int i = 1; i <= number_of_nodes; i++)
{
if (unsettled.contains(i))
{
if (distances[i] <= min)
{
min = distances[i];
node = i;
}
}
}
return node;
}
单独版本中已知的bug如下:
if (unsettled.contains(i))
{
if (distances[i] > min)
{
min = distances[i];
node = i;
}
}
这是我用来查找它的 JUnit 测试用例。我正在尝试使用 Java Reflection 访问此方法,然后尝试断言返回的节点是否等于该节点实际上是更大的距离。
这是我的测试用例:
int[][] adjacency = { { 0, 0, 0, 0, 0 },
{ 0, 0, 9, 10, 0 },
{ 0, 9, 0, 0, 0 },
{ 0, 5, 4, 0, 2 },
{ 0, 5, 4, 3, 0 },
};
Dijkstra d1 = new Dijkstra(4);
d1.dijkstra_algorithm(adjacency, 1);
/*
try {
nodeMethod = Dijkstra.class.getDeclaredMethod("getNodeWithMinimumDistanceFromUnsettled");
} catch (NoSuchMethodException e) {
System.out.println(e.getMessage());
}
nodeMethod.setAccessible(true);
try {
node = (int) nodeMethod.invoke(d1);
System.out.println("min node is: " + node);
} catch (IllegalAccessException | InvocationTargetException e) {
System.out.println(e.getMessage());
}
assertEquals(node, 0);
*/
当我运行测试时,它似乎没有做任何事情,因为我没有得到任何输出。我觉得我想太多了。有没有更简单的方法可以不使用 java 反射来找到这个 bug?
【问题讨论】:
-
您必须验证 d1.dijkstra_algorithm(adjacency, 1) 的返回值。例如。 assertEquals(expectedValue, d1.dijkstra_algorithm(adjacency, 1))
-
有什么问题?那你的测试不起作用?或者您的测试确实有效,但非常复杂,应该以更简单的方式解决?
标签: java bash reflection junit dijkstra