2016-04-04 7 views
1

Macht es Sinn, in Unit-Test eines csv Leser zu verspotten, wo wir die csv lesen mögen und sie in POJOs setzen und einige Fragen stellen? (speziell ich spotte Datei lesen).Mockito und Unit-Test für einen CSV-Leser

Lassen Sie uns das folgende Beispiel an:

ICsvBeanReader beanReader = null; 
    beanReader = new CsvBeanReader(new FileReader(csvFileName), 
      CsvPreference.STANDARD_PREFERENCE); 
    String[] header = beanReader.getHeader(true); 
    Book bookBean = null; 
    while ((bookBean = beanReader.read(Book.class, header, 
     processors))!= null) { 
    books.add(bookBean); 
    } 

Danke im Voraus.

Antwort

2

Streng genommen eine Einheit Test wurde entwickelt, um die Funktionalität eines Stück Code zu testen, statt der Integration der Code mit einem äußeren Teil des Programms. Das Testen der Funktionalität des Lesens einer tatsächlichen Datei wäre ein Test Integration anstelle eines Komponententests. Ein Integrationstest ist auch wichtig, weil Sie sicherstellen möchten, dass Ihr Dateireader auf tatsächlichen Dateien funktionieren kann. Um jedoch sicherzustellen, dass der Code ausgeführt wird, können Sie auch einen Komponententest erstellen.

Um einen Komponententest zu erstellen, können Sie das Dateileser-Objekt überspionieren, um eine Dummy-Antwort (byte[] oder einen anderen von der Schnittstelle bereitgestellten Typ) zurückzugeben. Dann können Sie Ihre POJOs füllen und Ihre Behauptungen ausführen, dass sich alles wie erwartet verhält.

So zusammenzufassen, sowohl eine Integrationstest und ein Unit-Test könnte eine gute Idee sein, aber ein Unit-Test ermöglicht es Ihnen, die Logik des Codes zu isolieren und zu testen.

Update:

Um Ihre aktualisierten Codebeispiel zu berücksichtigen, würde ich gehen über die CsvBeanReader wie dieser spöttischen:

ICsvBeanReader mockedBeanReader = mock(CsvBeanReader.class); 
Book book1 = new Book(); 
Book book2 = new Book(); 
Book book3 = new Book(); 
when(mockedBeanReader.getHeader(true)) 
    .thenReturn(new String[]{"here", "is", "header"}); 
when(mockedBeanReader.read(Book.class, header, processors)) 
    .thenReturn(book1) 
    .thenReturn(book2) 
    .thenReturn(book3); 

Und jetzt haben Sie eine voll verspottet CsvBeanReader Objekt. Sie können Assertionen in Ihren POJOs ausführen und sicherstellen, dass die Geschäftslogik Ihres Codes korrekt ist.

+0

Vielen Dank. Ich habe eine Frage. Wenn der Dateileser eine Dummy-Antwort zurückgibt, was wird verspottet? Ich habe der Frage einen Beispielcode hinzugefügt. –

+1

Sehr nett. Vielen Dank. –

2

Dies scheint eine gute Idee - es kann Ihr Gerät entkoppeln von Ihrer Implementierung von Lese getestet werden(). Wenn Sie zum Lesen der Dateien in eine andere Bibliothek wechseln, müssen Ihre Komponententests nicht alle neu geschrieben werden.

+0

Nette Idee, könnte dies helfen, Trennung von Bedenken in den Komponententests zu realisieren. –