3 Stimmen

Junit-Testfall für Wrapper-Klasse

Ich habe eine Java-Klasse, die einfach eine Bibliotheksklasse erweitert und eine Methode der übergeordneten Klasse mit einem Standardparameter aufruft. Wie kann ich dafür einen Junit-Test schreiben? Ein MockObjectTestCase ist auch gut. Hier ist ein Beispiel für das, wovon ich spreche:

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 die Wrapper-Methode nicht einmal notwendig ist, aber sie erleichtert häufige Aufrufe der Methode. Beachten Sie die Klasse funktioniert gut, ich bin nur daran interessiert, wie der Unit-Test geschrieben ist.

3voto

Scott Bale Punkte 10399

Wenn Sie bereit sind, Ihre Klasse ein wenig umzugestalten, würde ich empfehlen MessageResource delegieren an einen MessageSource Instanz, anstatt die ResourceBundleMessageSource . Dann würde ich Mocks in meinem Unit-Test verwenden. Etwas wie dies:

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 Einheitstest

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);
  }

}

2voto

Kathy Van Stone Punkte 24475

Für dieses spezielle Beispiel würde ich mir wahrscheinlich nicht die Mühe machen, es zu testen.

Wenn Sie es testen müssen, versuchen Sie 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 macht es noch mehr Sinn, sie nicht zu testen. Wenn Sie mehrere Tests wie diesen haben, verschieben Sie die ersten beiden Zeilen in eine Setup-Vorrichtung.

0voto

mamboking Punkte 4319

Ich glaube nicht, dass es sich lohnt, dafür einen Unit-Test zu schreiben. Wenn es bereits einen Test für ResourceBundleMessageSource.getMessage() gibt, dann sollte das ausreichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X