2009-06-17 12 views
2

Ich habe eine Java-Klasse, die einfach eine Bibliotheksklasse erweitert und eine Methode des übergeordneten Elements mit einem Standardparameter aufruft. Wie schreibe ich einen Junit-Test dafür? Ein MockObjectTestCase ist auch gut. Hier ist ein Beispiel dafür, was ich spreche:Junit-Testfall für Wrapper-Klasse

public class ResourceBundleMessageSource { 
    public String getMessage(String key, Object[] objects, Locale locale) { 
     //Spring library method 
    } 
} 

public class MessageResource extends ResourceBundleMessageSource { 
    public String getMessage(String key) { 
     return (getMessage(key, null, Locale.getDefault()); 
    } 
} 

Ich weiß, dass das Wrappermethode nicht einmal notwendig ist, aber macht häufige Anrufe zu erleichtern. Beachten Sie, dass die Klasse funktioniert. Ich bin nur daran interessiert, wie der Komponententest geschrieben wird.

Antwort

2

Für dieses spezielle Beispiel würde ich mich nicht bemühen, es zu testen.

Wenn Sie es tun müssen, um testen, versuchen, so etwas wie:

@Test 
public void getDefaultMessage() { 
    ResourceBundleMessageSource origSource = <create source> 
    MessageResource subSource = <create with same criteria as origSource> 
    String key = <some key that is locale-specific> 
    assertEquals(origSource.getMessage(key, null, Locale.getDefault()), 
       subSource.getMessage(key)); 
} 

Wenn die ersten beiden Zeilen schwer zu schreiben sind, dann ist es noch mehr Sinn macht es nicht zu testen. Wenn Sie mehrere Tests wie diese haben, verschieben Sie die ersten beiden Zeilen in ein Setup-Gerät.

0

Ich glaube nicht, dass es sich überhaupt lohnt, einen Komponententest dafür zu schreiben. Wenn es bereits einen Test für ResourceBundleMessageSource.getMessage() gibt, sollte das gut genug sein.

3

Wenn Sie bereit wären, Ihre Klasse etwas zu refaktorisieren, würde ich MessageResource Delegat an eine MessageSource Instanz empfehlen, statt ResourceBundleMessageSource zu erweitern. Dann würde ich Mocks in meinem Komponententest verwenden. Etwas wie folgt aus:

public class MessageResource implements MessageSource { 

    private final MessageSource delegate; 

    public MessageResource(MessageSource delegate) { 
    this.delegate = delegate; 
    } 

    public String getMessage(String key) { 
    return delegate.getMessage(key, null, Locale.getDefault()); 
    } 

    // need to implement three other MessageSource methods, 
    // simple pass-throughs to delegate 

} 

und Unit-Test

public class MessageResourceTest { 

    private MessageSource mockDelegate; 
    private MessageResource messageResource; 

    @Before 
    public void setUp() throws Exception { 
    mockDelegate = //mock with your favorite framework, or by hand 
    messageResource = new MessageResource(mockDelegate); 
    } 

    @Test 
    public void testGetMessage() { 
    String key = "foo"; 

    String actualMessage = messageResource.getMessage(key); 

    assertEquals(key, /* get key passed to mock delegate */); 
    assertSame(Locale.getDefault(), /* get Locale passed to mock delegate */); 
    assertEquals(/*expected message from mock*/, actualMessage); 
    } 

} 
Verwandte Themen