Seitenhistorie
...
Die Konfiguration von Log4j ermöglicht es auch, im Unit Test selbst das Logging zu verwenden. Das ist bei der Testentwicklung meist recht praktisch.
Unit Test in TestNG
Klassendefinition der Unit Test Klasse
Die Klassendefinition für einen TestNG Unit Test könnte wie folgt aussehen:
...
Diese Beispiel benutzt org.springframework.test.context.testng.AbstractTestNGSpringContextTests, um einen TestNG zu erzeugen, der mit einem Spring Test Context arbeitet. Soll der Test zudem transaktional ablaufen, müsste statt dessen von AbstractTransactionalTestNGSpringContextTests geerbt werden.
Die @ContextConfiguration
Annotation stellt sicher, dass innerhalb des Spring Test Contextes ganz einfach Mocks erzeugt werden können. Und sie gibt die XML Datei an, aus der der Spring Test Context erzeugt werden soll. Oft kann man eine XML Context Definition für mehrere Tests verwenden. (Meist versuche ich nur einen XML Context Definition pro zu testenden (Java) Paket zu verwenden. )
Spring Injection in der Unit Test Klasse
Im Quellcode folgen nun die Spring Injections:
Codeblock | ||||
---|---|---|---|---|
| ||||
[...] // siehe oben
private final DataFactory dataFactory = new DataFactory();
@Autowired
private PdmcaeExplorerFacadeRemote dut;
// mocks from spring context
@Autowired
private MasterDataFacadeLocal masterDataFacade;
@Autowired
private CollectableEOEntityProvider collectableEntityProvider;
@Autowired
private MasterDataTreeNodeFactory mdTreeNodeFactory;
@Autowired
private MetaProvider metaProvider;
// end of mocks from spring context
|
Zunächst wird eine Hilfsklasse erzeugt, die für die Erzeugung der für den Test nötigen Input Value Objects verwendet wird (s.u.). Oft reicht es eine solche Hilfsklasse pro zu testenden (Java) Pakets zu erzeugen. Es ist üblich, diese Klasse DataFactory
zu nennen. Eine alternative zur direkten Erzeugung wäre die Spring Injection auch der DataFactory
. Dies hätte zudem den Vorteil, dass auch innerhalb der DataFactory
Spring Injektion verwendet werden könnte.
Anschließend wird die zu testende Klasse injiziert (dut
ist hier der kanonische Name Device under Test). Die Methoden dieser Klasse sollen von Unit Test überprüft werden.
Darauf folgend werden verschiedene Spring Beans des Spring Test Contextes injiziert. Dabei handelt es sich in diesem Fall ausschließlich um Mock Objekte.
Boilerplate Code
Codeblock | ||||
---|---|---|---|---|
| ||||
[...] // siehe oben
@BeforeClass(dependsOnMethods={"springTestContextPrepareTestInstance"})
public void setupParamValidation(){
// Test class setup code with autowired classes goes here
}
@AfterTest(alwaysRun=true)
public void afterTest() {
reset(masterDataFacade);
}
|