2015-04-30 20 views
8

Próbuję znaleźć najlepszy sposób na wdrożenie przypadku testowego do ćwiczeń klasowych. Moje ćwiczenie klasowe dostarcza znanego błędu i powinienem napisać przypadek testowy, aby mu się nie udało, a tym samym znaleźć błąd. Wymagało to użycia algorytmu Dijkstra.JUnit Test Case za pomocą metody prywatnej w algorytmie Dijkstra

Jest to poprawna wersja dołączonego kodu:

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; 
} 

Znany bug w oddzielnej wersji jest następujący:

if (unsettled.contains(i)) 
     { 
      if (distances[i] > min) 
      { 
       min = distances[i]; 
       node = i; 
      } 
     } 

i tutaj jest przypadek test JUnit używam znaleźć to. Próbuję uzyskać dostęp do tej metody za pomocą Java Reflection, a następnie próbuję stwierdzić, czy węzeł zwrócony jest równy węzłowi, tak naprawdę jest większą odległością.

Oto mój przypadek testowy:

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

Kiedy wykonać test, to nie wydaje się zrobić wszystko jak mam żadnego wyjścia. Czuję, że to przemyślam. Czy istnieje łatwiejszy sposób na znalezienie tego błędu bez użycia refleksji java?

+0

Musisz zweryfikować wartość zwracaną przez d1.dijkstra_algorithm (sąsiedztwo, 1). Na przykład. assertEquals (expectedValue, d1.dijkstra_algorithm (adjacency, 1)) –

+0

Na czym polega problem? Że twój test nie działa? Lub, że twój test działa, ale jest bardzo złożony i powinien być rozwiązany w prostszy sposób? – CoronA

Odpowiedz

1

Ponieważ oznaczono to jako , odpowiem rzeczowo. Nie powinieneś testować metod prywatnych, powinieneś przetestować publiczną (lub chronioną) metodę, która używa metody prywatnej. Więc:

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

(Puryści zapewne krytykować mnie za to, ale podczas pracy na starszych kod rutynowo zmienić private metod do protected aby umożliwić łatwy zasięg testów jednostkowych przed refaktoringu, tak że - unpure - idea zostaje przeniesiony na do Ciebie).

Pozdrowienia,