Frühling und T estNG funktioniert gut zusammen, aber es gibt einige Dinge, die man beachten sollte. Abgesehen von der Unterklasse von AbstractTestNGSpringContextTests müssen Sie wissen, wie sie mit Standard-TestNG-Setup-/Teardown-Annotationen interagiert.
TestNG hat vier Ebenen der Einrichtung
- BeforeSuite
- BeforeTest
- BeforeClass
- Vorbearbeitungsmethode
die genau auftreten, wie Sie (gutes Beispiel für Selbst dokumentieren APIs würde erwarten,). Diese haben alle einen optionalen Wert namens "dependsOnMethods", der einen String oder String [] annehmen kann, wobei Name oder Name (n) der Methoden auf derselben Ebene stehen.
Die Klasse "AbstractTestNGSpringContextTests" verfügt über eine Annotated-Methode "BeforeClass" mit dem Namen "springTestContextPrepareTestInstance", von der Sie abhängig davon abhängig sein müssen, ob Sie eine AutoWire-Klasse verwenden. Bei Methoden müssen Sie sich nicht um das Autowiren kümmern, da es auftritt, wenn die Testklasse vor der Klassenmethode eingerichtet wird.
Das lässt nur die Frage offen, wie Sie eine autowired Klasse in einer mit BeforeSuite annotierten Methode verwenden könnten. Sie können dies tun, indem Sie springTestContextPrepareTestInstance manuell aufrufen - während dies nicht standardmäßig eingerichtet ist, habe ich es mehrmals erfolgreich durchgeführt.
Also, zu veranschaulichen, die eine modifizierte Version des Beispiels des Arup:
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;
@Test
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class TestValidation extends AbstractTestNGSpringContextTests {
@Autowired
private IAutowiredService autowiredService;
@BeforeClass(dependsOnMethods={"springTestContextPrepareTestInstance"})
public void setupParamValidation(){
// Test class setup code with autowired classes goes here
}
@Test
public void testNullParamValidation() {
// Testing code goes here!
}
}
Dank. Genau das suche ich. –
Was für ein Chaos. Zuerst erzwingt bestimmte Klassenhierarchie. Zweitens ist es ziemlich verwirrend, dass ein Testfall, der '@ Transactional 'verwendet, die nicht-transaktionale Version versehentlich erweitert. Leider gibt es keine andere Möglichkeit, einen Spring mit TestNG zu verwenden. –
@GrzesiekD. Ich hoffe, dass sich in 4,5 Jahren etwas geändert hat. :) Also bitte überprüfen Sie den Status quo. – lexicore