【问题标题】:JUnit Test Case via Private Method in Dijkstra Algorithm通过 Dijkstra 算法中的私有方法的 JUnit 测试用例
【发布时间】: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


【解决方案1】:

既然你用 标记了这个,我会以同样的方式回答。您不应该对私有方法进行单元测试,而应该测试使用私有方法的公共(或受保护)方法。所以:

@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 以在重构之前启用简单的单元测试覆盖率,因此 - 不纯 - 想法在此传递给您)。

干杯,

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 2014-06-05
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 2020-08-05
    相关资源
    最近更新 更多