2017-08-07 21 views
0

イテレータを持つこのメソッドをどのように渡すかわからないので、この単純なJUnitテストメソッドに執着しています。もし誰かが見ていることが本当に役立つだろう。ここでJUnitのテストメソッドが失敗します

がメインクラスです:

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

}

ここでは機能しない私のテストトライアル方法が、あります。私はそれをよく理解している場合は

@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)); '** **なぜあなたは結果が** 1 **であるべきだと主張しているのですか?あなたの検索関数**は、2番目の引数(2)以降を検索するので、1を返すこともできないので、返す可能性が最も低い番号は** 2 **です。 –

+0

@ErwinBolwidt確かに、私はassertEquals(2、instance.searchNum(x、2));まだ失敗しています。 – Camila

+0

数値は決して初期化されません。テスト結果の印刷出力を含める必要がありますが、結果としてNULLポインタの例外が発生します。 – Tezra

答えて

0

...「searchNum」関数は、内部の「X」のインデックスを返します。 私は主に、どのようにこの試験方法では、これらの特定の値を渡すためにイテレータとのトラブルを抱えています

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

動作しません。 – Camila

0

変更

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

から:それは価値があなたが比較する必要がありますので、あなたの "数のリストが...この場合は、「6」第3の位置にある(インデックス= 2)その後、

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

し、それが動作するかどうかを参照してください。上記のコードで指摘したように、6が2番目の数値配列にある場合は、必ず動作します。

+0

動作しません。 – Camila

+0

あなたのCS102DZ14クラスを共有してください。 – Adeel

+0

ご覧ください!私はちょうどそれがあるべきであるように編集しました。 – Camila

1

あなたが引数としてイテレータを渡して練習にこれをやっている、あなたがやるべきことはこれですと仮定:

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

そしてテストはこのようなものでなければなりません:

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

この必要がありますあなたのコードがテストしようとしていたものをコンパイルしてテストしてください。あなたのデザインにはいくつかの問題があります。

最初に、何らかの理由でリストの一部だけをチェックしたい場合を除いて、findSameに3番目の引数を渡すべきではありません。以下のようなものがより効率的になり、機能はより簡単になります。

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

代わりのあなたは「このイテレータはこの要素が含まれている場合findSomeチェック」を考えることができます「このイテレータは指定されたインデックスでまたはを超えて、この要素が含まれている場合findSomeチェック」を考えます。

第2に、コードを常に一貫してスタイルする必要があります。あなたはあなたのコードを一貫してインデントしていませんでした。findSameはpublic class mainと同じ量だけインデントされました。私はfindSameがメインのクラスと同じレベルにあり、メインの内部には含まれていなかったと思いました。

インデントすると、プログラムの構造について一目で分かります。プログラムの全般的な流れを理解するために、プログラムの詳細をすべて読む必要はありません。

+0

メインクラスをどのように呼び出すことができますか? – Camila

+0

私の方法を再現しました!あなたは今見てみることができますか? – Camila

+0

更新に応じて編集されました。 –

関連する問題