Jika maksud Anda pribadi seperti yang saya kira Anda maksudkan, maka tidak - Anda tidak boleh mengujinya. Anda seharusnya hanya unit yang menguji perilaku / keadaan yang dapat diamati. Anda mungkin kehilangan poin di balik siklus "red-green-refactor" dari TDD (dan jika Anda tidak melakukan tes terlebih dahulu maka prinsip yang sama berlaku). Setelah tes ditulis dan lulus, Anda tidak ingin itu berubah saat melakukan refactoring. Jika Anda dipaksa untuk menguji fungsionalitas pribadi unit maka itu mungkin berarti bahwa pengujian unit di sekitar fungsionalitas publik cacat. Jika sulit dan rumit untuk menulis tes di sekitar kode publik maka mungkin kelas Anda melakukan terlalu banyak atau masalah Anda tidak jelas.
Lebih buruk lagi, seiring waktu tes unit Anda akan menjadi bola dan rantai memperlambat Anda tanpa menambahkan nilai apa pun (mengubah implementasi, misalnya optimasi atau penghapusan duplikasi, seharusnya tidak berpengaruh pada tes unit). Akan tetapi, kode internal harus diuji unit karena perilaku / keadaan dapat diamati (hanya dengan cara terbatas).
Ketika saya pertama kali melakukan pengujian unit saya menarik segala macam trik untuk menguji unit barang-barang pribadi tetapi sekarang, dengan beberapa tahun di bawah ikat pinggang saya, saya melihatnya lebih buruk daripada membuang-buang waktu.
Inilah sedikit contoh konyol, tentu saja dalam kehidupan nyata Anda akan memiliki lebih banyak tes daripada ini:
Katakanlah Anda memiliki kelas yang mengembalikan daftar string yang diurutkan - Anda harus memeriksa bahwa hasilnya diurutkan, bukan bagaimana sebenarnya mengurutkan daftar itu. Anda bisa memulai implementasi Anda dengan algoritma tunggal yang hanya mengurutkan daftar. Setelah selesai, pengujian Anda tidak perlu diubah jika Anda kemudian mengubah algoritma penyortiran Anda. Pada titik ini Anda memiliki tes tunggal (dengan asumsi bahwa penyortiran tertanam di kelas Anda):
- Apakah hasil saya diurutkan?
Sekarang katakan Anda ingin dua algoritma (mungkin satu lebih efisien dalam beberapa keadaan tetapi tidak yang lain), maka masing-masing algoritma dapat (dan umumnya, harus) disediakan oleh kelas yang berbeda dan kelas Anda mengambil dari mereka - Anda dapat memeriksa ini terjadi untuk skenario yang Anda pilih menggunakan ejekan, tetapi tes asli Anda masih valid dan karena kami hanya memverifikasi perilaku yang dapat diamati, tidak perlu diubah. Anda berakhir dengan 3 tes:
- Apakah hasil saya diurutkan?
- Diberikan skenario (katakanlah daftar awal hampir diurutkan untuk memulai dengan) adalah panggilan yang dibuat ke kelas yang mengurutkan string menggunakan algoritma X?
- Diberikan skenario (daftar awal dalam urutan acak) adalah panggilan yang dilakukan ke kelas yang mengurutkan string menggunakan algoritma Y?
Alternatifnya adalah mulai menguji kode pribadi di dalam kelas Anda - Anda tidak mendapatkan apa-apa dari ini - tes di atas memberi tahu saya segala sesuatu yang perlu saya ketahui sejauh menyangkut pengujian unit. Dengan menambahkan tes pribadi Anda membuat jaket lurus, berapa banyak pekerjaan jika Anda tidak hanya memeriksa bahwa hasilnya diurutkan tetapi juga bagaimana itu diurutkan?
Tes (dari jenis ini) hanya boleh berubah ketika perilaku berubah, mulai menulis tes terhadap kode pribadi dan itu keluar jendela.