Laden...

Zugriff auf non-public Member

Erstellt von Bernhard vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.899 Views
B
Bernhard Themenstarter:in
119 Beiträge seit 2005
vor 17 Jahren
Zugriff auf non-public Member

Hallo,

um bei Unit Tests einen einfachen Zugriff auf non-public Member zu bekommen, hab ich mir einen Satz von Klassen geschrieben. Einerseits weil es eben für manche Unit Test Frameworks gar nicht wirklich verfügbar ist (auf die Dauer Reflection zu verwenden ist einfach zu aufwendig), andererseits, weil mir die Lösung durch Code-Genierung (siehe Visual Studio Team System) überhaupt nicht gefällt. Ich hab es da lieber ein wenig dynamischer, aber seht am besten selbst an einem einfachen Beispiel:


using Accessor = mycsharp.Util.Accessor;

public class Person {

    private string name;

    public Person(string name) {
        SetName(name);
    }

    public string Name {
        get {
            return name;
        }
    }

    // nur um auch eine private Methode dabei zu haben
    private void SetName(string name) {
        this.name = name;
    }
}

public interface IPerson {

    string name {
        get;
        set;
    }

    void SetName(string name);
}

public class Application {

    public static void Main() {
        Person person = new Person("Foo Bar");    
        IPerson privatePerson = Accessor.CreateAccessor<IPerson>(person);
        
        Console.WriteLine(person.Name);

        privatePerson.name = "Bar Foo";
        Console.WriteLine(person.Name);

        privatePerson.SetName("Blubber");
        Console.WriteLine(person.Name);

        Console.ReadKey();
    }
}

Das Interface hat eigentlich überhaupt nichts mit der Klasse selbst zu tun, sondern legt mir lediglich eine Schnittstelle für den Zugriff auf non-public Member fest. Die Namen der Eigenschaften, bzw. Methoden werden dabei einfach übernommen, wie man auch im Beispiel sieht. Um dies zu ermöglichen habe ich auch eine eigene Implentierung von einem Proxy (siehe java.lang.reflect.Proxy), auch wenn es vllt bereits die 100. ist. Leider ist es derzeit noch nicht vollständig, so fehlt z.B: die Unterstützung für private Events, out und ref Parameter, alles in allem Dinge, die ich beim Testen eigentlich ohnehin nicht benötige, daher wurde es auch nicht implementiert.

Dachte mir, dass das eventuell ganz gut in die Komponentensammlung passt 🙂

grüße