Pengantar Pengujian di Java
Maria Milusheva
Senior Software Engineer
Pada pelajaran sebelumnya dan latihannya, kita menguji dengan menegaskan nilai balik.
Namun bagaimana jika tidak ada nilai balik?
Bagaimana jika nilai balik tidak penting atau tidak informatif?
Contoh: menyimpan ke database.

Database: repositori digital untuk menyimpan, mengelola, dan mengamankan kumpulan data terstruktur. Banyak penyedia database:

Server database itu tahan lama, aman, andal, dan kapasitasnya tinggi
Database nyata terlalu besar dan kompleks untuk unit test (namun bisa dipakai di integration test)
Misalkan kita memproses log:
public class MessageProcessor {
private InfoStore infoStore; // Will store info log messages here
private ErrorStore errorStore; // Will store error log messages here
public void saveMessage(String message) {
if (message.startsWith("[INFO]")) {
infoStore.save(message);
}
if (message.startsWith("[ERROR]")) {
errorStore.save(message);
}
}
}
Untuk tes, kita hanya butuh antarmuka dasar:
// Blueprints for InfoStore and ErrorStore
// Mocks don't need the mocked classes to be properly implemented
interface InfoStore {
void save(String message);
}
interface ErrorStore {
void save(String message);
}
Bagaimana menguji pesan tersimpan tanpa membuat database?
Tegaskan mock digunakan:
import static org.mockito.Mockito.verify;
Tegaskan mock tidak digunakan:
import static org.mockito.Mockito.verifyNoInteractions;
@Test void process_savesToInfoStore_whenInfoMessage() { InfoStore infoStore = mock(InfoStore.class); ErrorStore errorStore = mock(ErrorStore.class); MessageProcessor messageProcessor = new MessageProcessor(infoStore, errorStore);String message = "[INFO] Process started."; messageProcessor.saveMessage(message); // Will use either InfoStore or ErrorStore// Verify which one of the two databases was used verify(infoStore).save(message); verifyNoInteractions(errorStore); }
Bagaimana jika pesan yang kita buat adalah:
String message = "[ERROR] Process failed!"
Maka kita akan melihat kegagalan tes seperti ini:
Wanted but not invoked:
infoStore.save("[ERROR] Process failed!");
Actually, there were zero interactions with this mock.
Kita dapat memverifikasi berapa kali log dipanggil:
import static org.mockito.Mockito.times;
List<String> messages = new ArrayList<>(); // Create list and add elements messages.add("[INFO] Processing data..."); messages.add("[INFO] Processing data..."); messages.add("[INFO] Processing data..."); messageProcessor.saveMessageList(messages); // Save the three messagesverify(infoStore, times(3)).save("[INFO] Processing data...");
DNT_CURLLY_TAG_3
Pengantar Pengujian di Java