2017-07-15 5 views
0

Ich habe ein Stück Code, der über mehrere Integrationstests wiederholt wird. Der Code wird vor und nach den Tests ausgeführt.Autowire Junit Regel im Integrationstest

Ich habe entschieden, dass die Verwendung einer JUnit @Rule der beste Weg ist, dies zu erreichen.

Das Problem ist, dass die Regel Zugriff auf einige @Autowired Spring Beans haben muss. (Die Tests ausgeführt mit Feder Integration Test Runner so Autowire funktioniert

Ich habe eine Regel:.

public class CustomSpringRule extends ExternalResource { 
    private final SomeOtherBean; 

    public CustomSpringRule(SomeOtherBean someOtherBean) { 
     this.someOtherBean = someOtherBean; 
    } 

    @Override 
    public void before() { 
     someOtherBean.someMethod(); 
    } 
    (...) 
} 

ich meinen Kontext haben, auf die ich habe meine Bohnen hinzugefügt:

@Bean 
public CustomSpringRule getCustomSpringRule(SomeOtherBean someOtherBean) { 
    return new CustomSpringRule(someOtherBean) 
} 

Schließlich habe ich gerade die Regel Bean innerhalb der Testdatei:

Alles funktioniert gut, aber ich nie wirklich uns ed @Rule Annotation und ich bin etwas besorgt, dass JUnit Reflection und Spring Autowire nicht gut zusammenpassen oder es wird einige Probleme geben, die auf den ersten Blick nicht offensichtlich sind.

Hat jemand irgendwelche Vorschläge, ob dies gültig und sicher ist?

+0

es scheint wie ein bisschen Code-Geruch zu Tests, die in einer bestimmten Reihenfolge ausgeführt werden müssen. Tests sollten unabhängig voneinander sein –

Antwort

0

Ich glaube nicht, dass Sie @Rule hier brauchen, "Ich habe ein Stück Code, der über mehrere Integrationstests wiederholt wird. Der Code wird vor und nach den Tests ausgeführt." Dies kann mithilfe von JUnits @Before und @After Annotationen erreicht werden. Methoden, die mit diesen Anmerkungen versehen sind, werden vor/nach jedem Test ausgeführt. Sie können also Ihren gemeinsamen Code von diesen Methoden aus aufrufen.

+0

Ja konnte ich obwohl ich Codewiederholung vermeiden wollte und eine saubere Regel habe. Auf der anderen Seite bin ich mir nicht sicher, ob ich Spring Beans benutzen sollte, um eine Testzeichenlogik zu machen. – Taks

+0

Nun, ich meine, behalten Sie Ihren Code irgendwo anders als Test, damit Sie ihn aus allen Tests verwenden können. Nur Anruf zu ihm wird wiederholt, etwas wie Sie oben erwähnt "someOtherBean.someMethod();" – ravinikam