2009-05-19 4 views
0

Um eine gute Testabdeckung zu erhalten, möchte ich die WriteExternal und ReadExternal Methoden von IPortableObject testen (wie unter Creating an IPortableObject Implementation (.NET) beschrieben).Testen einer Oracle Coherence IPortableObject Implementierung in .NET

Hier ist Code ähnlich zu dem, was ich in meiner Testmethode habe (was ich mag, und es funktioniert).

Aber um das zu bekommen, zu arbeiten, hatte ich Unterklasse tun PofStreamWriterBeginProperty und PofStreamReader außer Kraft zu setzen AdvanceTo außer Kraft zu setzen. Das riecht für mich ein bisschen komisch, aber ich konnte keine bessere Lösung finden. Unten ist mein tatsächlicher Code für meinen CoherenceTestHelper.

Frage: Hat jemand andere Einheit ihre IPortableObject Implementierung einen besseren Weg getestet?

public static class CoherenceTestHelper 
{ 
    public static T CopyUsingPofSerialization<T>(T ipoIn) where T : IPortableObject, new() 
    { 
     T ipoOut = new T(); 

     IPofContext context = new SimplePofContext(); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
     IPofWriter writer = new MyPofStreamWriter(new DataWriter(ms), context); 
     ipoIn.WriteExternal(writer); 

     ms.Seek(0, 0); 
     IPofReader reader = new MyPofStreamReader(new DataReader(ms), context); 
     ipoOut.ReadExternal(reader); 
     } 

     return ipoOut; 
    } 

    private class MyPofStreamWriter : PofStreamWriter 
    { 
     public MyPofStreamWriter(DataWriter writer, IPofContext context) 
     : base(writer, context) 
     { 
     } 

     protected override void BeginProperty(int index) 
     { 
     } 
    } 

    private class MyPofStreamReader : PofStreamReader 
    { 
     public MyPofStreamReader(DataReader reader, IPofContext context) 
     : base(reader, context) 
     { 
     } 

     protected override bool AdvanceTo(int index) 
     { 
     return true; 
     } 
    } 
} 

Antwort

0

Dieser Test ist zu sehr mit der tatsächlichen Ausführung der IPofReader und IPofWriter. Ich schlage vor, Sie erstellen eine Kopie des Reader/Writer mit einem Framework wie Rhino Mocks. Übergeben Sie Ihre POF-Methode (n) dem verspotteten Reader/Writer. Stellen Sie dann einfach fest, dass die Lese-/Schreibmethoden mit den richtigen Parametern aufgerufen wurden.

+0

Dann würde ich einen bestimmten Mock für jede IPortableObject-Implementierung benötigen, wo dieser Helfer für jedes Objekt verwendet werden kann. Außerdem möchte ich sicherstellen, dass die Anrufe (z. B. ReadString und WriteString) ausgeglichen sind und in der gleichen Reihenfolge sind, von der ich nicht sicher bin, wie ich sie vortäuschen soll. Ich bin mit der tatsächlichen Ausführung konfrontiert. –

0

Ich habe untersucht, wie Unit Test IPofSerializer ist und ich erwarte, dass es ähnlich zu Ihrem Problem ist. Was ich gefunden habe, ist, dass Sie PofStreamWriter.WriteObject und PofStreamReader.ReadObject aufrufen müssen, um den Benutzertyp korrekt serialisieren und deserialisieren zu können. Der Benutzertyp muss auch beim PofContext registriert sein, damit er korrekt funktioniert.

Der Grund dafür ist, dass die PofStreamWriter-Klasse eine geschachtelte Unterklasse enthält, die beim Serialisieren von Benutzertypen verwendet wird. Diese Unterklasse schreibt zusätzliche Daten über den Typ, den der PofStreamReader dann verwendet, um den Typ korrekt zu deserialisieren. Ohne diese zusätzlichen Daten kann der PofStreamReader nicht feststellen, um welchen Typ es sich handelt und welcher Serializer verwendet werden soll. Es sieht so aus, als wäre es nicht eingerichtet, um das Testen eines Serialisierers in vollständiger Isolation zu erlauben, da zu viele Zustände während der Serialisierung intern von PofStreamReader und PofStreamWriter verwaltet werden.

Zum Testen IPofSerializers Ich mache folgendes

var context = new SimplePofContext() 
context.RegisterUserType(1001, typeof(SerializableType), new SerializatableTypeSerializer()) 

using (var ms = new MemoryStream()) 
{ 
    var writer = new PofStreamWriter(new DataWriter(ms), context); 
    writer.WriteObject(0, object); 

    ms.Seek(0,0); 

    var reader = new PofStreamReader(new DataReader(ms), context); 
    var ob = reader.ReadObject(0) 
} 

Ich vermute, aber noch nicht getestet, dass für IPortableObjects Sie müssen nichts mit dem Kontext registrieren inorder für diese zu arbeiten.

Verwandte Themen