Maaf untuk necro di posting ini, tapi saya merasa harus mempertimbangkan beberapa hal yang tampaknya belum disentuh.
Pertama yang terpenting - ketika kita menemukan diri kita membutuhkan akses ke anggota pribadi di kelas selama pengujian unit, umumnya merupakan bendera merah besar dan gemuk yang telah kita abaikan dalam pendekatan strategis atau taktis kita dan secara tidak sengaja telah melanggar prinsip tanggung jawab tunggal dengan mendorong perilaku di tempat yang tidak seharusnya. Merasakan perlunya mengakses metode yang benar-benar tidak lebih dari subrutin terisolasi dari prosedur konstruksi adalah salah satu kejadian paling umum dari ini; Namun, ini seperti bos Anda yang mengharapkan Anda datang ke tempat kerja siap-pergi dan juga memiliki beberapa kebutuhan buruk untuk mengetahui rutinitas pagi apa yang Anda lalui untuk membawa Anda ke keadaan itu ...
Contoh paling umum lainnya dari kejadian ini adalah ketika Anda mencoba menguji "kelas dewa" pepatah. Ini adalah jenis masalah khusus di dalam dan dari dirinya sendiri, tetapi menderita dari masalah dasar yang sama dengan perlu mengetahui detail intim dari suatu prosedur - tapi itu keluar dari topik.
Dalam contoh khusus ini, kami telah secara efektif menetapkan tanggung jawab menginisialisasi sepenuhnya objek Bar ke konstruktor kelas FooBar. Dalam pemrograman berorientasi objek, salah satu penyewa inti adalah bahwa konstruktornya "sakral" dan harus dijaga terhadap data yang tidak valid yang akan membuat keadaan internal tidak valid dan membiarkannya gagal di tempat lain di hilir (dalam apa yang bisa menjadi sangat dalam) pipa.)
Kami gagal melakukannya di sini dengan mengizinkan objek FooBar menerima Bilah yang belum siap pada saat FooBar dibangun, dan telah mengompensasi dengan semacam "peretasan" objek FooBar untuk mengambil masalah menjadi miliknya sendiri tangan.
Ini adalah hasil dari kegagalan untuk mematuhi penyewa lain pemrograman berorientasi objek (dalam kasus Bar,) yang menyatakan bahwa keadaan objek harus sepenuhnya diinisialisasi dan siap untuk menangani panggilan masuk apa pun ke anggota publiknya segera setelah pembuatan. Sekarang, ini tidak berarti segera setelah konstruktor dipanggil dalam semua contoh. Ketika Anda memiliki objek yang memiliki banyak skenario konstruksi kompleks, maka lebih baik untuk mengekspos setter ke anggota opsionalnya ke objek yang diimplementasikan sesuai dengan pola desain-penciptaan (Pabrik, Pembangun, dll ...) Di salah satu kasus terakhir,
Dalam contoh Anda, properti "status" Bar tampaknya tidak dalam keadaan valid di mana FooBar dapat menerimanya - sehingga FooBar melakukan sesuatu untuk memperbaikinya.
Masalah kedua yang saya lihat adalah tampaknya Anda mencoba menguji kode Anda daripada mempraktikkan pengembangan yang digerakkan oleh tes. Ini jelas merupakan pendapat saya sendiri pada saat ini; tetapi, jenis pengujian ini benar-benar anti-pola. Apa yang akhirnya Anda lakukan adalah jatuh ke dalam perangkap menyadari bahwa Anda memiliki masalah desain inti yang mencegah kode Anda dari diuji setelah fakta, daripada menulis tes yang Anda butuhkan dan kemudian pemrograman untuk tes. Apa pun masalah yang Anda hadapi, Anda masih harus berakhir dengan jumlah tes dan jalur kode yang sama jika Anda benar-benar mencapai implementasi SOLID. Jadi - mengapa mencoba dan merekayasa balik jalan Anda menjadi kode yang dapat diuji ketika Anda bisa mengatasi masalah tersebut saat upaya pengembangan Anda dimulai?
Seandainya Anda melakukan itu, maka Anda akan menyadari jauh sebelumnya bahwa Anda harus menulis beberapa kode yang agak menjengkelkan untuk menguji desain Anda dan akan memiliki kesempatan sejak awal untuk menyelaraskan kembali pendekatan Anda dengan mengubah perilaku menjadi implementasi yang mudah diuji.