dev*_*932 8 java reflection bash junit dijkstra
我正在试图找出为课堂练习实施测试用例的最佳方法.我的课堂练习提供了已知的bug,我应该为它编写一个测试用例,以便它失败,从而找到bug.它涉及使用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;
}
Run Code Online (Sandbox Code Playgroud)
单独版本中的已知错误如下:
if (unsettled.contains(i))
{
if (distances[i] > min)
{
min = distances[i];
node = i;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我用来找到它的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);
*/
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,它似乎没有做任何事情,因为我没有输出.我觉得我在想这个.有没有使用java反射找到这个bug的更简单的方法?
既然你用junit标记了这个,我就会以同样的方式回答。您不应该对私有方法进行单元测试,而应该测试使用私有方法的公共(或受保护)方法。所以:
@Test
public void testDijkstra()
{
Dijkstra d1 = new Dijkstra(4);
assertThat( "should be <what you expect>" ,
d1.dijkstra_algorithm(adjacency, 1) ,
equalTo( 42 /* <-- expected result goes here*/ ) );
}
Run Code Online (Sandbox Code Playgroud)
(纯粹主义者可能会因此而抨击我,但在处理遗留代码时,我会定期更改private
方法,以便protected
在重构之前启用简单的单元测试覆盖率,以便 - 不纯粹 - 想法特此传递给您)。
干杯,