2017-08-07 1 views
0

Ich bin auf dieser einfachen JUnit Testmethode fest, wie ich nicht sicher bin, wie diese Methode übergeben wird, die Iterator hat. Wenn jemand einen Blick darauf werfen könnte, wäre das wirklich hilfreich. HierJUnit Testmethode schlägt fehl

ist Hauptklasse:

public class Main { 
    public static void main(String[] args) { 

    final List<Integer> numbers = Arrays.asList(3, 4, 6, 1, 9); 
    final Integer x = Integer.valueOf(1); 
    System.out.println(findSame(numbers.iterator(), x, 0)); 
} 
public static final int findSame(Iterator<Integer> iterator, Integer x, int idx) { 
    if (!iterator.hasNext()) { 
     return -1; 
    } 

    if (iterator.next().equals(x)) { 
     return idx; 
    } else { 
     return findSame(iterator, x, idx+1); 
    } 
} 

}

Hier ist meine Test-Studie Methode ist, die nicht funktionsfähig ist. Ich habe Probleme mit Iterator hauptsächlich und wie diese speziellen Werte in diesem Testverfahren weitergeben müssen:

@Test 
public void searchNumReturnsIndex1(){ 
    Main instance = new Main();   

    int x = 1; 

    Iterator<Integer> iterator; 
    int result = Main.findSame(null, x, 3); 
    assertEquals(2, instance.findSame(null,x, 3)); 
    } 
+0

'assertEquals (1, instance.searchNum (x, 2)); '** Warum ** meinst du, dass das Ergebnis ** 1 ** sein sollte? Ihre Suchfunktion ** kann nicht ** sogar 1 zurückgeben, weil sie ab dem zweiten Argument (2) sucht, so dass die niedrigste mögliche Anzahl ** 2 ** ist. –

+0

@ErwinBolwidt Sicher, aber wenn ich AssertEquals (2, instance.searchNum (x, 2)); Es versagt immer noch. – Camila

+0

Zahlen werden niemals initialisiert.Sie sollten den Ausdruck der Testergebnisse einbeziehen, dies sollte jedoch zu einer Nullzeiger-Ausnahme führen. – Tezra

Antwort

0

Wenn ich es gut verstanden haben ... die den Index ‚x‘ ‚searchNum‘ Funktion innerhalb zurück Ihre 'Zahlen' Liste ... in diesem Fall '6' ist in der dritten Position (Index = 2), so das ist der Wert, den Sie vergleichen müssen:

assertEquals(2, instance.searchNum(x, 0)); 
+0

Es funktioniert nicht. – Camila

0

Wechsel von

assertEquals(1, instance.searchNum(x, 2)); 

zu

assertEquals(2, instance.searchNum(x, 2)); 

und dann sehen, ob es funktioniert oder nicht. Es wird sicherlich funktionieren, wenn 6 im zweiten Index der Zahlenmatrix ist, wie Sie oben im Code erwähnt haben.

+0

Es funktioniert nicht. – Camila

+0

teilen Sie bitte Ihre CS102DZ14 Klasse. – Adeel

+0

Bitte sehen Sie es! Ich habe gerade bearbeitet, wie es sein sollte. Danke – Camila

1

Angenommen, Sie tun dies einen Iterator als Argument zu üben vorbei, was Sie tun sollten, ist dies:

public class main { 
    public static void main(String[] args) { 
     // put whatever you want here, but if 'findSome' gets it's iterator as an argument, 
     // then you shouldn't be trying to define it's list here. It's list is being passed 
     // to it as an argument. 
    } 

    /* don't put final here unless you are working with subclasses and don't want them making their own versions of findSame */ 
    public static int findSame(Iterator<Integer> iterator, Integer x, int idx) { 
     if(!iterator.hasNext()) { 
      return -1; 
     } 

     if(iterator.next().equals(x)) { 
      return idx; 
     } else { 
      return findSame(iterator, x, idx+1); 
     } 
    } 
} 

und der Test sollte wie folgt sein:

@Test 
public void searchNumReturnsIndex1() { 
    Main instance = new Main(); 

    List<Integer> numbers = Arrays.asList(3, 4, 6, 1, 9); 

    Iterator<Integer> iterator = numbers.iterator(); 

    int result = instance.findSame(iterator, 1, 3); 
    assertEquals(2,result); 
} 

Dies sollte kompilieren und testen Sie, was Ihr Code testen wollte. Es gibt jedoch einige Probleme mit Ihrem Design.

Zuerst sollten Sie findSame nicht dieses dritte Argument nehmen, es sei denn, Sie möchten aus irgendeinem Grund nur einen Teil der Liste überprüfen. Etwas wie das Folgende ist effizienter und die Funktion wird einfacher.

findSame(Iterator<Integer> iterator, Integer x) { 
    while(iterator.hasNext()) { 
     if(iterator.next().equals(x)) { 
      return iterator.previousIndex(); 
     } 
    } 
    return -1; 
} 

Statt „findSome überprüft, ob diese Iterator dieses Element am angegebenen Index enthält oder jenseits“ des Denkens kann man denkt „findSome überprüft, ob diese Iterator dieses Element enthält“.

Zweitens sollten Sie Ihren Code immer einheitlich gestalten. Sie haben Ihren Code nicht konsistent eingerückt, findSame wurde um den gleichen Betrag eingerückt wie public class main, was mich denken ließ, dass findSame auf derselben Ebene wie die Klasse main und nicht in main enthalten war.

Einrücken sollte Ihnen auf einen Blick über die Struktur des Programms informieren, so dass Sie nicht jedes Detail eines Programms lesen müssen, um den allgemeinen Ablauf zu erhalten.

+0

wie kann ich Hauptklasse nennen? – Camila

+0

Ich habe meine Methode neu erstellt! Kannst du es dir jetzt ansehen? – Camila

+0

Bearbeitet als Antwort auf Ihr Update. –