2017-11-05 1 views
0
interface MyInterface {} 

static class ImplA implements MyInterface {} 

static class ImplB implements MyInterface {} 

class OuterTests { 

    @ParameterizedTest 
    @MethodSource("myInterfaceProvider") 
    void test(MyInterface myInterface) {} 

    static Stream<MyInterface> myInterfaceProvider() { 
     return Stream.of(new ImplA(), new ImplB()); 
    } 

    @Nested 
    class InnerTests{ 

     @Test 
     void nestedTest() { 
      //how to access myInterface:MyInterface? 
     } 

    } 

} 
+0

warum es nicht Mitglied setzen? – Mzf

+0

Sicher, das würde funktionieren. Aber wie/wo wird das Mitglied eingestellt? – cnmuc

+0

Sie können @Parameter für Feldinjektion verwenden, sehen Sie mehr Beispiel hier: https://github.com/junit-team/junit4/wiki/parameterized-tests, wenn Sie wollen, kann ich ein komplettes Beispiel geben – Mzf

Antwort

1

InnerTests wird nicht unter dem parametrisierte Test im Testbaum zuzugreifen:

enter image description here

So kann man nicht passieren das Argument der Testmethode für die geschachtelte Testklasse.

Hier ist eine Möglichkeit, Tests für die Schnittstellen in JUnit Jupiter zu definieren:

interface MyInterfaceTests { 

    MyInterface newInstance(); 

    @Test 
    default void test() { 
     MyInterface instance = newInstance(); 
     // test something 
    } 
} 

class ImplATests implements MyInterfaceTests { 
    @Override 
    public MyInterface newInstance() { 
     return new ImplA(); 
    } 
} 

class ImplBTests implements MyInterfaceTests { 
    @Override 
    public MyInterface newInstance() { 
     return new ImplB(); 
    } 
} 

Alternativ können Sie es @TestFactory mit schreiben:

@TestFactory 
Stream<DynamicNode> test() { 
    return Stream.of(new ImplA(), new ImplB()) 
     .map(instance -> dynamicContainer(instance.getClass().getSimpleName(), Stream.of(
      dynamicTest("test 1",() -> { 
       // test something 
      }), 
      dynamicTest("test 2",() -> { 
       // test something else 
      }) 
     ))); 
}