Dienstag, 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

Keine Kommentare:

Kommentar veröffentlichen