Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

...

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
languagejava
title/<extension-server>/src/test/java/de/fdm/server/explorer/PdmcaeExplorerFacadeBeanTest.java
[...] // 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
languagejava
title/<extension-server>/src/test/java/de/fdm/server/explorer/PdmcaeExplorerFacadeBeanTest.java
[...] // 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);
    }