Showing posts with label Test. Show all posts
Showing posts with label Test. Show all posts

Monday, 7 May 2012

Maven: Test Source generieren und damit testen

Maven 3.0.3
exec-maven-plugin 1.2.1

Beim Beispielprojekt handelt es sich um einen Source Code Generator, der aus einem File, das Text in einer Domain Specific Language enthält, Java Code generiert.

Soweit so gut, nun soll beim Build aus einigen Test DSL Files der Source Code erzeugt werden und gegen einige JUnit Tests gefahren werden, um zu sehen ob der generierte Code den Erwartungen entspricht.

Das Ganze war entgegen meinen ersten Befürchtungen dann dank Maven einfach, dafür gibts das exec-maven-plugin.

   
    org.codehaus.mojo
    exec-maven-plugin
    1.2.1
    
     
      
       java
      
      generate-test-sources
     
    
    
     com.xxx.xxxx.gen.Action
     src/test/java/gen
    
   
  

Hier wird die Main Methode der angegebenen Klasse ausgeführt, in meinen Fall Test Source an der richtigen Stelle erzeugt (Das ist in der Klasse festgelegt, wird hier eigentlich nur dadurch bedacht das testSourceRoot angegeben wurde, damit Maven auch sicher mitkriegt das dieser Code vor dem Test auch brav kompiliert wird). Einfacher gehts eigentlich nimmer.

Damit vom generierten Code nicht irgendwann störende Restbestände herumliegen lösche ich diese bevor neuer generiert wird mithilfe des maven-clean-plugin:



    maven-clean-plugin
    
     
      
       src/test/java/gen
       false
      
     
    
   

Das wars eigentlich.

Was etwas irritieren kann ist, daß vor dem Build immer unkompilierbarer Code herumliegt, damit die JUnit Tests kompilieren muß erst der Test Source generiert werden.



Maven: Build soll zu Ende geführt werden, auch wenn Tests fehlschlagen

Maven 3.0.3

Hierbei hilfreich hat sich der Parameter maven.test.failure.ignore erwiesen, einfach auf true setzen und schon läuft der Build auch bei Test Failures zu Ende und schließt sogar mit Success ab, wenn sonst nix Störendes passiert.

Links:
stackoverflow Beitrag zu diesem Thema



Tuesday, 7 September 2010

JUnit Tests mit Spring, EasyMock

Spring 3.0.2.RELEASE
EasyMock 3.0

Verwendet man in seinem Projekt Spring-Annotations wie @Autowired kann man in das Problem reinrutschen, das JUnit Tests schwer aufzubauen sind. Darum hilft man sich mit Mock Objekten, die dem Test vorgaukeln, daß ein benötigtes Objekt tatsächlich vorhanden ist.

Ausgangslage ist ein SupportBean, das zu instanzieren einen riesen Aufwand bedeuten würde oder überhaupt unmöglich ist (denken wir uns mal).

@Component
public class SupportBean {
 public String getDoSomething() {
  return doSomething();
 }
}

Diese Klasse können wir also nicht instanzieren. Unsere zu testende Klasse bedient sich der Springannotation Autowired:

@Component
public class ToTestBean {
 @Autowired private SupportBean supportBean; 
 public String toTestMethod() {
  return this.supportBean.getDoSomething() + " <--- so ist es";
 }
}  

Um zu testen wollen wir ein Mockobjekt erzeugen, das wenn es die Methode doSomething() ausführt, den String "Ich bin ein Mock" zurückgibt, das schreiben wir direkt in die Testmethode, in freier Natur ist man wahrscheinlich mit einer setUp() Methode besser bedient. Um die EasyMock Methoden verwenden zu können importieren wir diese statisch.

import static org.easymock.EasyMock.*;

import org.easymock.EasyMock;
import org.springframework.test.util.ReflectionTestUtils;

@Test
public void testToTestBean() {
 ToTestBean toTestBean = new ToTestBean();
 SupportBean fakeSupportBean = createMock(SupportBean.class);
 expect(fakeSupportBean.getDoSomething).andReturn("Ich bin ein Mock");
 replay(fakeSupportBean);
 ReflectionTestUtils.setField(toTestBean, "supportBean", fakeSupportBean); 
 assertTrue("Ich bin ein Mock <-- so ist es".equal(toTestBean.toTestMethod()));
}

Im Prinzip sagt man den Mock was er antworten soll, wenn er aufgefordert wird eine Methode auszuführen, mit replay aktiviert man ihn sozusagen. Mit der setField() Methode gibt man an in welches Zielobjekt (1.Parameter), man welches Feld (2.Parameter) durch welchen Mock (3.Parameter) ersetzen will.

Voila, schon funken Tests, die sonst ummöglich oder nur mit haufenweise Aufwand baubar wären.

Links:
Springhomepage
EasyMock 3.0 Schnelleinstieg