2017-06-23 4 views
1
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = TestConfig.class, loader = AnnotationConfigContextLoader.class) 
@TestExecutionListeners(listeners = LoadBalancingIntegrationTest.class, mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS) 
public class LoadBalancingIntegrationTest extends AbstractTestExecutionListener{ 

    //... 

    DummyWebAppService[] dummyWebAppControllers = new DummyWebAppService[4]; 

    int haproxyListeningPort = 8000; 

    //DummyWebApp 
    @Value("${dummyWebApp.mvnPath}") 
    String mavenPath; 

    @Value("${dummyWebApp.webAppPath}") 
    String webAppPath; 

    @Override 
    public void beforeTestClass(TestContext testContext) throws Exception { 
     dummyWebAppControllers[0] = new DummyWebAppService(mavenPath, webAppPath, 8080); 
    } 

    //..test cases follow 
} 

Ich verwende in meinem Testfall die Injektion mit Federabhängigkeit. Ich habe ein Problem mit der Reihenfolge der Ausführung der TestExecutionListeners. Gemäß this documentation about the ordering of custom TestExecutionListeners kann der Auftrag über die Ordered-Schnittstelle oder @Order-Annotation und by default, the order is of lowest predence for any custom TestExecutionListener angegeben werden. Beim Ausführen dieser Testklasse wird jedoch beforeTestClass vor jeder Injektion ausgeführt. Ich legte sogar mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS, so dass keine Standard TestExecutionListeners würde vermisst werden. Wenn Sie vorTestClass auskommentieren, wird die Injektion normal ausgeführt.Bestellung von TestExecutionListeners

Meine Frage ist, warum wird meine beforeTestClass zuerst ausgeführt? Kann ich sagen, dass es nach der Injektion ausgeführt werden soll?

+1

Warten gelöst, wird diese Klasse soll ein Test oder eine Ausführungs Zuhörer sein? Du mischst Bedenken. – chrylis

+0

@chrylis Ich benutze nur TestExecutionListener, um eine beforeTestClass-Methode so einzurichten, ich sehe nicht, warum ich es jetzt umgestalten sollte, werde ich tun, nachdem –

+0

Vielleicht zu klären, mein Problem ist nicht, dass die Methoden oder Abhängigkeitsinjektion funktioniert nicht, sie sind, aber in der falschen Reihenfolge. Die Dependency-Injektion sollte zuerst und dann die beforeTestClass-Methode ausgeführt werden. –

Antwort

0

Nicht sicher, ob es die richtige Lösung ist, aber es reicht für meinen Anwendungsfall, der Bohnen vor der beforeTestClass injiziert. zwingen Sie es einfach autowire von Schreiben @Override public void beforeTestClass(TestContext testContext) throws Exception { testContext.getApplicationContext().getAutowireCapableBeanFactory().autowireBean(this); dummyWebAppControllers[0] = new DummyWebAppService(mavenPath, webAppPath, 8080); }

ein bisschen hacky Scheint autowire zu zwingen, aber hey ist mein Problem

+0

Was Sie tun, ist bereits hacky imho. Sie haben einen 'TestExecutionListener', der selbst ein Test ist. Das solltest du nicht tun. Um die Eigenschaften zu erhalten, sollten Sie die 'Umgebung' und nicht' @Wert' verwenden. Auch das, was Sie hier tun, ist kaum ein Fall für einen 'TestExecutionListener' und kann leicht mit einer einfachen Setup-Methode erreicht werden, die mit' @ Before' versehen ist. –

+0

@M. Deinum war mir mit meinen Absichten für den Aufbau dieser Testklasse nicht klar. Es ist ein Integrationstest, bei dem ich verschiedene Dummy-Web-Apps starte, die sehr lange brauchen, um zu starten, ohne '@ Before' zu ​​verwenden. Ich wollte '@ BeforeClass' verwenden, aber JUnit besteht darauf, dass sie natürlich statisch sind. Jetzt stoße ich auf das Problem, bei dem Spring keine statischen Objekte injizieren kann. Daher diese 'beforeTestClass'-Methode. Ich verstehe auch nicht die Notwendigkeit, "Umgebung" zu verwenden? [Dieser Beitrag sagt etwas anderes] (https://stackoverflow.com/questions/26897314/differences-between-value-annotation-and-the-environment-api) –

+0

Auf diese Weise brauchen Sie nicht den '@ Value', Sie kann 'testContext.getApplicationContext(). getEnvironment(). getProperty()' so verwenden, dass Sie Ihren Hack entfernen können ... Aber wie gesagt, das wirkliche Problem ist die Tatsache, dass Sie hier Bedenken mischen. –