gpt4 book ai didi

java - 通过 Dijkstra 算法中私有(private)方法的 JUnit 测试用例

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:56:48 26 4
gpt4 key购买 nike

我正在尝试找出为类练习实现测试用例的最佳方法。我的类练习提供了已知的错误,因此我应该编写一个测试用例使其失败,从而找到错误。它涉及使用 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 反射更容易找到这个错误的方法?

最佳答案

因为你用 标记了它,我会实物答复。您不应该对私有(private)方法进行单元测试,而应该测试使用私有(private)方法的公共(public)(或 protected )方法。所以:

@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*/ ) );
}

(纯粹主义者可能会为此抨击我,但在处理遗留代码时,我经常将 private 方法更改为 protected 以在重构之前启用简单的单元测试覆盖,因此- unpure - idea特此传授给您)。

干杯,

关于java - 通过 Dijkstra 算法中私有(private)方法的 JUnit 测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29966956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com