Bagaimana anda mengejek Disegel kelas?

Mengejek disegel kelas dapat cukup sakit. Saat ini saya mendukung Adapter pola untuk menangani hal ini, tapi sesuatu terus terasa aneh.

Jadi, Apa adalah cara terbaik anda mengejek disegel kelas?

Java jawaban yang lebih dari menyambut. Pada kenyataannya, saya akan mengantisipasi bahwa masyarakat Jawa telah berurusan dengan hal ini lagi dan memiliki banyak untuk menawarkan.

Tapi di sini adalah beberapa .NET pendapat:

Mengomentari pertanyaan (1)

Untuk .BERSIH, anda dapat menggunakan sesuatu seperti TypeMock, yang menggunakan profiling API dan memungkinkan anda untuk menghubungkan ke panggilan untuk hampir apa pun.

Komentar (6)

Saya percaya bahwa Mol, dari Microsoft Research, memungkinkan anda untuk melakukan itu. Dari Tahi lalat halaman:

Tahi lalat dapat digunakan untuk memutar apapun .NET metode, termasuk non-virtual/statis metode disegel jenis.

UPDATE: ada sebuah kerangka kerja baru yang disebut "Palsu" di masa mendatang VS 11 rilis yang dirancang untuk menggantikan Tahi lalat:

Palsu Kerangka dalam Visual Studio 11 adalah generasi berikutnya dari Tahi lalat & Rintisan, dan pada akhirnya akan menggantinya. Palsu berbeda dari Tahi lalat, namun, begitu bergerak dari Tahi lalat dengan Palsu akan memerlukan beberapa modifikasi pada kode anda. Panduan untuk migrasi ini akan tersedia di kemudian hari.

Persyaratan: Visual Studio 11 Ultimate, .NET 4.5

Komentar (0)
Larutan

Saya aturan umum praktis adalah bahwa benda-benda yang saya butuhkan untuk mengejek harus memiliki antarmuka umum juga. Saya pikir ini adalah hak desain-bijaksana dan membuat tes jauh lebih mudah (dan biasanya apa yang anda dapatkan jika anda melakukan TDD). Lebih lanjut tentang ini dapat dibaca di Google Testing Blog - latest post (Lihat butir 9).

Juga, saya've telah bekerja terutama di pulau Jawa di masa lalu 4 tahun dan saya bisa mengatakan bahwa saya dapat mengandalkan satu tangan berapa kali saya've dibuat akhir (disegel) kelas. Aturan lain di sini adalah saya harus selalu memiliki alasan yang baik untuk menutup kelas, sebagai lawan untuk penyegelan itu secara default.

Komentar (7)

Saya hampir selalu menghindari ketergantungan pada luar kelas jauh di dalam kode saya. Sebaliknya, saya'd lebih suka menggunakan adaptor/jembatan untuk berbicara dengan mereka. Dengan cara itu, saya'm berurusan dengan saya semantik, dan rasa sakit menerjemahkan terisolasi dalam satu kelas.

Hal ini juga membuat lebih mudah untuk beralih saya ketergantungan dalam jangka panjang.

Komentar (0)

Masalah dengan TypeMock adalah bahwa hal itu alasan desain yang buruk. Sekarang, saya tahu bahwa hal ini sering orang lain's desain yang buruk itu's bersembunyi, tapi perijinan ke proses pengembangan yang dapat menyebabkan sangat mudah untuk mengizinkan buruk anda sendiri desain.

Saya pikir jika anda're akan menggunakan mocking framework, anda harus menggunakan yang tradisional (seperti Moq) dan membuat lapisan isolasi di sekitar unmockable hal, dan mengejek isolasi lapisan sebaliknya.

Komentar (3)

Saya menemukan masalah ini baru-baru ini dan setelah membaca / mencari web, sepertinya tidak ada cara mudah di sekitar kecuali untuk menggunakan alat lain seperti yang disebutkan di atas. Atau crude menangani hal-hal seperti yang saya lakukan:

  • Membuat contoh disegel kelas tanpa mendapatkan constructor dipanggil.

  • Sistem.Runtime.Serialisasi.FormatterServices.GetUninitializedObject(instanceType);

  • Menetapkan nilai untuk properti anda / bidang melalui refleksi

  • YourObject.GetType().GetProperty("PropertyName").SetValue(dto, newValue, null);

  • YourObject.GetType().GetField("FieldName").SetValue(dto, newValue);

Komentar (1)

Hal ini sangat wajar untuk mengejek disegel kelas karena banyak framework kelas yang disegel.

Dalam kasus saya saya'm mencoba untuk pura-pura .Net's MessageQueue kelas sehingga saya dapat TDD saya anggun exception handling logika.

Jika ada yang memiliki ide-ide tentang bagaimana untuk mengatasi Moq's kesalahan mengenai "tidak Valid setup pada non-overridable anggota", tolong beritahu saya.

kode:


    [TestMethod]
    public void Test()
    {
        Queue messages = new Queue();
        Action sendDelegate = msg => messages.Enqueue(msg);
        Func receiveDelegate =
            (v1, v2) =>
            {
                throw new Exception("Test Exception to simulate a failed queue read.");
            };

        MessageQueue mockQueue = QueueMonitorHelper.MockQueue(sendDelegate, receiveDelegate).Object;
    }
    public static Mock MockQueue
                (Action sendDelegate, Func receiveDelegate)
    {
        Mock mockQueue = new Mock(MockBehavior.Strict);

        Expression<action> sendMock = (msmq) => msmq.Send(It.IsAny()); //message => messages.Enqueue(message);
        mockQueue.Setup(sendMock).Callback(sendDelegate);

        Expression receiveMock = (msmq) => msmq.Receive(It.IsAny(), It.IsAny
Komentar (3)

Saya biasanya mengambil rute menciptakan sebuah antarmuka dan adaptor/proxy kelas untuk memfasilitasi mengejek jenis disegel. Namun, saya've juga bereksperimen dengan melompat-lompat penciptaan antarmuka dan membuat proxy type non-disegel dengan metode virtual. Ini bekerja dengan baik ketika proxy adalah benar-benar alami kelas dasar yang merangkum dan pengguna bagian dari disegel kelas.

Ketika berhadapan dengan kode yang diperlukan adaptasi ini, aku bosan melakukan tindakan yang sama untuk membuat antarmuka dan jenis proxy jadi saya menerapkan perpustakaan untuk mengotomatisasi tugas.

Kode ini agak lebih canggih dari sampel yang diberikan dalam artikel referensi anda, itu menghasilkan sebuah majelis (bukan kode sumber), memungkinkan untuk kode generasi yang akan dilakukan pada setiap jenis, dan doesn't memerlukan banyak konfigurasi.

Untuk informasi lebih lanjut, silahkan merujuk ke halaman ini.

Komentar (0)

Meskipun saat ini hanya tersedia dalam versi beta rilis, saya pikir yang bermanfaat menjaga dalam pikiran shim fitur baru Palsu framework (bagian dari Visual Studio 11 rilis Beta).

Shim jenis menyediakan mekanisme untuk memutar apapun .NET metode untuk pengguna didefinisikan delegasi. Shim jenis kode yang dihasilkan oleh Palsu generator, dan mereka menggunakan delegasi, yang kita sebut shim jenis, untuk menentukan metode baru implementasi. Di bawah tenda, shim jenis menggunakan callback yang disuntikkan pada runtime dalam metode MSIL tubuh.

Secara pribadi saya melihat menggunakan ini untuk mengejek metode pada disegel kerangka kelas seperti DrawingContext.

Komentar (0)

Apakah ada cara untuk menerapkan disegel kelas dari sebuah antarmuka... dan mengejek antarmuka bukan?

Sesuatu dalam diriku merasa bahwa memiliki disegel kelas yang salah di tempat pertama, tapi yang's just me :)

Komentar (1)