10 Stimmen

Transaktionaler parametrisierter Test von Spring und Autowiring

Gibt es eine Möglichkeit, eine Klasse, die AbstractTransactionalJUnit4SpringContexts erweitert, um schön mit JUnit eigenen @RunWith(Parameterized.class) zu spielen, so dass Felder als Autowired markiert richtig verdrahtet bekommen?

@RunWith(Parameterized.class)
public class Foo extends AbstractTransactionalJUnit4SpringContextTests {

    @Autowired private Bar bar

    @Parameters public static Collection<Object[]> data() {
        // return parameters, following pattern in
        // http://junit.org/apidocs/org/junit/runners/Parameterized.html
    }

    @Test public void someTest(){
        bar.baz() //NullPointerException
    }
}

0voto

Marco Lackovic Punkte 5260

Hier ist, wie ich es in Spring Boot funktioniert 1.5.7 :

  1. Fügen Sie die @RunWith(Parameterized.class) Annotation zu Ihrer Klasse

  2. Injizieren Sie Ihre Abhängigkeit als Klassenfeld mit:

    @Autowired
    private Bar bar;
  3. Fügen Sie Ihre(n) Parameter als Klassenfelder hinzu:

    private final int qux;
    private final Boolean corge;
    private final String grault;
  4. Fügen Sie einen Konstruktor hinzu, um den/die Parameter wie folgt zu initialisieren:

     public Foo(int qux, Boolean corge, String grault) throws Exception {
         this.qux = qux;
         this.corge = corge;
         this.grault = grault;
         new TestContextManager(getClass()).prepareTestInstance(this);
     }
  5. Hinzufügen einer statischen Methode data die bei jeder Iteration eine Sammlung mit den Werten Ihrer Parameter zurückgibt, wobei die Reihenfolge eingehalten wird, in der sie an den Konstruktor übergeben werden:

     @Parameterized.Parameters
     public static Collection<Object[]> data() {
         return Arrays.asList(new Object[][]{
                 { 1, Boolean.FALSE, "Hello" },
                 { 2, Boolean.TRUE, null },
                 { 3, null, "world" }
         });
     }
  6. Schreiben Sie Ihren Test unter Verwendung der oben angegebenen Klassenfelder wie folgt:

    @Test public void someTest(){
        // Some arrangements
    
        // Some actions
    
        assertThat(myTestedIntValue, is(equalTo(qux));
        assertThat(myTestedBooleanValue, is(equalTo(corge));
        assertThat(myTestedStringValue, is(equalTo(grault));
    }

-1voto

Inspiriert von Simons Lösung können Sie TestContextManager auch mit parametrisierten Läufern verwenden:

@RunWith(Parameterized.class)
@ContextConfiguration(locations = "classpath:/spring-context.xml")
public class MyTestClass {

  @Parameters public static Collection data() {
    // return parameters, following pattern in
    // http://junit.org/apidocs/org/junit/runners/Parameterized.html
  }

  @Before
  public void setUp() throws Exception {
    new TestContextManager(getClass()).prepareTestInstance(this);
  }

}

Hier ist vollständiges Beispiel

Ich bin mir über die Handhabung von @Transactional in diesem Fall nicht sicher.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X