Jak wyśmiewać zapieczętowane zajęcia?

Wyśmiewanie klas zamkniętych może być uciążliwe. Obecnie preferuję wzór adaptera do obsługi tego, ale coś w tym jest dziwne.

Więc, jak najlepiej wyśmiewać zamknięte klasy?

odpowiedzi Java są mile widziane. W rzeczywistości spodziewałbym się, że społeczność Javy zajmuje się tym dłużej i ma wiele do zaoferowania.

Ale oto niektóre z. NET opinie:

Author: Brett Veenstra, 2008-08-09

10 answers

Moja ogólna zasada jest taka, że obiekty, które muszę naśladować, również powinny mieć wspólny interfejs. Myślę, że jest to właściwy projektowo i sprawia, że testy są o wiele łatwiejsze (i zwykle jest to, co dostajesz, jeśli robisz TDD). Więcej na ten temat można przeczytać na blogu Google Testing Ostatni post (patrz punkt 9).

Ponadto przez ostatnie 4 lata pracowałem głównie w Javie i mogę powiedzieć, że z jednej strony mogę policzyć, ile razy stworzyłem ostateczną (zapieczętowaną) klasę. Inną zasadą jest powinien zawsze mieć dobry powód, aby uszczelnić klasę, w przeciwieństwie do uszczelniania jej domyślnie.

 6
Author: abyx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-09 09:40:37

Dla. NET, możesz użyć czegoś w rodzaju TypeMock , który wykorzystuje profilowanie API i pozwala łączyć się w połączenia do prawie wszystkiego.

 18
Author: Haacked,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-28 06:44:22

Wierzę, że Moles , z Microsoft Research, pozwala ci to zrobić. Ze strony Krety:

Krety mogą być używane do detekcji dowolnego. NET metoda, w tym nie wirtualne / statyczne metody w typach zamkniętych.

Aktualizacja: istnieje nowy framework o nazwie "Fakes" w nadchodzącym wydaniu VS 11, który ma zastąpić Mole:

Framework Fakes w Visual Studio 11 jest kolejną generacją kretów i stubów, i będzie / align = "left" / Podróbki różnią się jednak od kretów, więc przejście od kretów do podróbek będzie wymagało pewnych modyfikacji kodu. Przewodnik dotyczący tej migracji będzie dostępny w późniejszym terminie.

Wymagania : Visual Studio 11 Ultimate,. NET 4.5

 13
Author: Mathias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-20 16:50:47

Problem z TypeMock polega na tym, że usprawiedliwia zły design. Wiem, że to często czyjeś złe projekty, które ukrywa, ale pozwolenie na to w procesie rozwoju może bardzo łatwo doprowadzić do pozwolenia na własne złe projekty.

Myślę, że jeśli masz zamiar używać szyderczego frameworka, powinieneś użyć tradycyjnego (takiego jak Moq) i utworzyć warstwę izolacyjną wokół rzeczy niemożliwej do zablokowania, a zamiast tego wyśmiewać warstwę izolacyjną.

 4
Author: Brad Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-28 07:04:19

Prawie zawsze unikam zależności od zewnętrznych klas głęboko w moim kodzie. Zamiast tego wolałbym użyć adaptera / mostu, aby z nimi porozmawiać. W ten sposób mam do czynienia z moją semantyką, a ból tłumaczenia jest odizolowany w jednej klasie.

Ułatwia również przełączanie zależności na dłuższą metę.

 4
Author: kyoryu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-11 04:08:01

Natknąłem się na ten problem niedawno i po przeczytaniu / przeszukiwaniu sieci, wydaje się, że nie ma łatwego sposobu na obejście poza użyciem innego narzędzia, jak wspomniano powyżej. Albo prymitywne obchodzenie się z rzeczami tak jak ja:

  • tworzy instancję klasy sealed bez wywoływania konstruktora.
  • System.Runtime.Serializacja.FormatterServices.GetUninitializedObject(instanceType);

  • Przypisz wartości do swoich właściwości / pól poprzez reflection

  • YourObject.GetType ().GetProperty ("PropertyName").SetValue (dto, newValue, null);
  • YourObject.GetType ().GetField("FieldName").SetValue (dto, newValue);
 2
Author: hassan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-12 19:42:34

Czy istnieje sposób na zaimplementowanie zamkniętej klasy z interfejsu... i zamiast tego wyśmiewać interfejs?

Coś we mnie czuje, że posiadanie klas jest złe, ale to tylko ja:)

 1
Author: Jon Limjap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-09 02:21:32

Ogólnie wybieram drogę tworzenia interfejsu i adaptera / klasy proxy, aby ułatwić wyśmiewanie typu sealed. Jednak eksperymentowałem również z pominięciem tworzenia interfejsu i uczynieniem typu proxy niezabezpieczonym metodami wirtualnymi. To działało dobrze, gdy proxy jest tak naprawdę naturalną klasą bazową, która hermetyzuje i użytkowników częścią zamkniętej klasy.

Mając do czynienia z kodem, który wymagał tej adaptacji, zmęczyło mnie wykonywanie tych samych czynności, aby stworzyć interfejs i typ proxy, więc zaimplementowałem bibliotekę do automatyzacji zadania.

Kod jest nieco bardziej wyrafinowany niż przykład podany w artykule, do którego się odwołujesz, ponieważ tworzy asembler( zamiast kodu źródłowego), pozwala na generowanie kodu na dowolnym typie i nie wymaga tak dużej konfiguracji.

Aby uzyskać więcej informacji, zapoznaj się z ta strona .

 1
Author: Steve Guidi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-08 15:48:01

Jest całkowicie rozsądne, aby wyśmiewać zapieczętowaną klasę, ponieważ wiele klas frameworku jest zapieczętowanych.

W moim przypadku próbuję wyśmiać klasę. Net MessageQueue, aby móc TDD moje wdzięczne logiki obsługi wyjątków.

Jeśli ktoś ma pomysły, jak przezwyciężyć błąd Moq dotyczący "nieprawidłowej konfiguracji na nieprzezroczystym członku", proszę daj mi znać.

Kod:

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

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

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

        Expression<Func<MessageQueue, Message>> receiveMock = (msmq) => msmq.Receive(It.IsAny<TimeSpan>(), It.IsAny<MessageQueueTransaction>());
        mockQueue.Setup(receiveMock).Returns<TimeSpan, MessageQueueTransaction>(receiveDelegate);

        return mockQueue;
    }
 1
Author: Adam Lenda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-06 20:05:01

Chociaż jest on obecnie dostępny tylko w wersji beta, myślę, że warto pamiętać o shim funkcji nowego Fakes framework (Część Visual Studio 11 Wersja Beta).

Typy Shim zapewniają mechanizm przekierowania dowolnej metody. NET do delegata zdefiniowanego przez użytkownika. Typy Shim są generowane przez generator Fakes i używają delegatów, które nazywamy typami shim, aby określić nowe implementacje metod. Pod maską, pod maską użyj wywołań zwrotnych, które zostały wstrzyknięte w czasie wykonywania w metodzie MSIL bodies.

Osobiscie patrzylem na uzywanie tego do upozorowania metod na klasach sealed framework, takich jak DrawingContext.

 1
Author: dodgy_coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-04 01:24:41