2015-04-30 14 views
8

Bir sınıf egzersizi için bir test vakasının uygulanmasının en iyi yolunu bulmaya çalışıyorum. Sınıf egzersizim bilinen bir hatayı sağlıyor ve ben de bunun başarısız olması için bir test durumu yazmalı ve böylelikle hatayı bulmalıyım. Dijkstra Algoritmasını kullanmıştır.JUnit Test Örneği Dijkstra Algoritmasında Özel Yöntemle

Bu sağlanan kodun doğru versiyonudur:

aşağıdaki
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; 
} 

ayrı sürümde bilinen böcek gibi: Burada

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

ve ben kullanıyorum JUnit Testi durumdur onu bulmak için. Java Yansıma ile bu yönteme erişmeye çalışıyorum ve sonra döndürülen düğümün düğüme eşit olup olmadığını denemeye çalışıyorum aslında daha büyük mesafe.

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

Testi çalıştırdığınızda, hiçbir çıkış olsun bir şey yapmak görünmüyor:

İşte benim test durumdur. Bunu düşündüğümü düşünüyorum. Bu hatayı java yansıması kullanmadan bulmanın daha kolay bir yolu var mı?

+0

Şerefe (bitişiklik, 1). Örneğin. assertEquals (beklenenValue, d1.dijkstra_algorithm (bitişik, 1)) –

+0

Sorun nedir? Testin işe yaramadı mı? Ya da testiniz işe yarıyor, ama çok karmaşık ve daha basit bir şekilde çözülmeli mi? – CoronA

cevap

1

Bunu ile etiketlediğinizden, aynısını alacağım. Birim testi özel yöntemleri olmamalıdır, özel yöntemi kullanan genel (veya korumalı) yöntemini sınamanız gerekir. Yani:

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

(Purists muhtemelen bunun için beni bash, ancak eski kod üzerinde çalışırken böylece rutin üstlenmeden önce kolay birim test kapsama sağlamak için protected için private yöntemlerini değiştirmek - unpure - Fikir vesile geçirilir sana). Sen d1.dijkstra_algorithm dönüş değerini doğrulamak gerekir