2017-11-24 27 views
1

を繰り返すことなく、私は次のようになりますこれは、Javaでスタックの私の独自の実装を構築しています:基本的な機能(ポップ、プッシュを提供するインタフェース「スタック」JUnit5:テスト複数のクラスコード

があり、ピークなど)。そして、私は2つの具体的なクラスを持っています.1つは配列の助けを借りて、もう1つはリンクされたリストを持っています(この場合重要ではありません)。

私はこれをJUnit5でテストしたいと思います。インターフェースをインスタンス化できないので、配列を持つクラスのために一度テストしなければなりません。コードが不必要に長くなります。私は、インターフェイスまたは同様の何かのすべての機能をテストできる方法はありますか?今では3番目の実装が追加されたら、もう一度書き直す必要があるからです。

私は既に 'ParameterizedTests'を試しましたが、何も進んでいません。

私は助けに満足しています!

+0

[ '@ ParameterizedTest'](https://blog.codefx.org/libraries/junit-5-parameterized-tests/)行く方法でなければなりません - 何あなたはそれを試すときに問題がありますか? –

+0

これを正しく使用する方法がわかりました。 JUnit5のチュートリアルが見つかりませんでした。 – Joey

+0

問題がどこにあるかを確認できるように最小限のコード例を投稿することはありますか? –

答えて

1

私が@ParameterizedTestと何の問題あなたは知りませんあなたがリクエストしたとおり、これはあなたのテストに役立つ非常に一般的なテストの例です:

import static org.junit.jupiter.api.Assertions.assertEquals; 
import org.junit.jupiter.params.ParameterizedTest; 
import org.junit.jupiter.params.provider.Arguments; 
import org.junit.jupiter.params.provider.MethodSource; 
... 

public static Stream<Arguments> provideStacks() { 
    return Stream.of(
     Arguments.of(new ArrayStack()), 
     Arguments.of(new LinkedStack()) 
); 
} 

@ParameterizedTest 
@MethodSource("provideStacks") 
public void test(Stack stack) { 
    stack.push(1); 
    assertEquals(1, stack.pop()); 
} 

public interface Stack { 
    void push(int i); 
    int pop(); 
} 

public static final class ArrayStack implements Stack { 
    @Override 
    public void push(int i) { 
    } 

    @Override 
    public int pop() { 
    return 1; 
    } 
} 

public static final class LinkedStack implements Stack { 
    @Override 
    public void push(int i) { 
    } 

    @Override 
    public int pop() { 
    return 1; 
    } 
} 
+0

大変ありがとうございますが、コードを実行するとエラーが発生します: "java.lang.AbstractMethodError" – Joey

+0

Err ...完全なスタックトレースをしていますか?また、どのようにテストを実行しますか?私はちょうどEclipseでそれを実行し、それはうまくいった。 –

+0

投稿を更新してエラーを追加し、IntelliJで実行しました。 – Joey

1

そして、ユニットテストでそれを呼び出すパラメータとして

private void testStack(Stack stack) {...} 

をインターフェイスタイプ所定のテストを行い、プライベートメソッドを作成します。

@Test 
public void testImplementations() { 
    testStack(new ListStack()); 
    testStack(new LinkedListStack()); 
} 
1

Test Interfacesが考えられます。テストをインターフェイスのデフォルトメソッドとして定義し、Stack実装ごとにインターフェイスを実装します。各実装は、追加のテストを追加することができますなど

interface StackContractTests { 

    Stack newEmptyStack(); 

    @Test 
    default void popsWhatWasLastPushed() { 
     Stack stack = newEmptyStack(); 
     stack.push("foo"); 
     assertEquals("foo", stack.pop()); 
    } 

    @Test 
    default void cannotPopFromEmptyStack() { 
     Stack stack = newEmptyStack(); 
     assertThrows(EmptyStackException.class, stack::pop); 
    } 
} 

public class ArrayListBasedStackTests implements StackContractTests { 
    @Override 
    public Stack newEmptyStack() { 
     return new ArrayListBasedStack(); 
    } 
} 

public class LinkedListBasedStackTests implements StackContractTests { 
    @Override 
    public Stack newEmptyStack() { 
     return new LinkedListBasedStack(); 
    } 
} 
関連する問題