2009-06-17 6 views
8

Für Unit-Tests versuche ich eine mock object einer Klasse ohne Konstruktoren zu schreiben.Ist es möglich, eine Klasse ohne Konstruktoren in Java zu erweitern?

Ist dies in Java überhaupt möglich, ist die Klasse einfach nicht erweiterbar?

+2

Die Frage wurde, kann es verspottet werden kann, kann es nicht die akzeptierte Antwort subclassed, gegeben werden, sollten Sie vielleicht die Frage ändern, wenn das, was du gemeint? – Yishai

+0

Meine Fragen fragt eindeutig nach Erweiterbarkeit. Es erwähnt nur das Spotten als den Grund, sich für diese Erweiterbarkeit zu wünschen. –

Antwort

18

Eine Klasse ohne Konstruktoren hat einen impliziten öffentlichen Konstruktor ohne Argumente, und ja, solange sie nicht endgültig ist, kann sie unterklassifiziert werden.

Wenn die Klasse nur private Konstruktoren hat, dann nein, kann es nicht.

+0

Die fragliche Klasse hat nur private Konstruktoren, einschließlich der ohne Argumente, also denke ich, ich bin nur Pech. –

+0

Sieht aus wie diese Klasse ist nicht sehr freundlich in Bezug auf die Prüfung. Du solltest wirklich Interfaces benutzen, anstatt konzeptuelle Typen ... –

+1

Also testeest du ein Singleton? Das entpuppt sich immer als Schmerzen im Hintern. –

2

Wenn die Java-Klasse keine definierten Konstruktoren hat, dann gibt es kein Problem für Sie. Die Probleme werden auftreten, wenn in der Klasse Konstruktoren definiert sind und alle für Sie unsichtbar sind (privat).

0

Wenn es nur private Konstruktoren gibt, können Sie die Reflektion weiterhin verwenden, um auf sie von außerhalb dieser Klasse zugreifen zu können.

+0

Aber das wird dir nicht helfen, die Klasse zu erweitern. Der Compiler lässt Sie keine Klasse mit nur privaten Konstruktoren erweitern. – Eddie

3

Frage wurde beantwortet, aber um einen Kommentar hinzuzufügen. Dies ist oft ein guter Zeitpunkt, um vorzuschlagen, dass der Code etwas testbar geschrieben wird.

Seien Sie kein Problem, erforschen Sie, was es braucht (wahrscheinlich Dependency Injection mindestens), lernen Sie über das Schreiben von Mocks und schlagen Sie eine vernünftige Reihe von Richtlinien vor, die Klassen nützlicher machen.

Wir mussten nur ein paar Singletons neu schreiben, um stattdessen DI zu verwenden, da Singletons notorisch schwer zu verspotten sind.

Dies mag nicht gut gehen, aber ein gewisses Maß an Codierung für die Testbarkeit ist Standard in den meisten professionellen Geschäften.

+0

Die Klasse, nach der ich suchen wollte, war eine Blackberry-Klasse, auf die ich keine Kontrolle habe. –

+0

Sie einen guten Punkt machen (vorausgesetzt, man Code spöttisch, dass sie sich ändern kann), aber dies wahrscheinlich als Kommentar statt einer Antwort eingegeben werden soll. – hotshot309

+0

Ich bin damit einverstanden, aber die Unfähigkeit, Text in Absätze in den Kommentaren zu trennen oft läßt mich Frusterated, aber in diesen Tagen (drei Jahre später) Ich denke, ich exaclty das getan hätte - leben und lernen. –

3

Ja, Sie können sich über das Objekt lustig machen, obwohl es nicht möglich ist, es unterzuklassifizieren (sicherlich nicht, ohne auf jeden Fall sehr vertraut mit dem Klassenlader zu werden). Here ist, wie Sie es mit JMock tun.

Mocking auf diese Weise ermöglicht es Ihnen, den Typ zu halten, ohne Subclassing, obwohl es wahrscheinlich ziemlich schwer bis unmöglich ist, nur bestimmte Verhalten zu necken. Diese Methode eignet sich also zum Testen von Klassen, die diese Klasse verwenden, nicht zum Testen der Klasse.

Wenn Sie tatsächlich Zugriff auf den Quellcode der Klasse haben, können Sie eine innere Klasse implementieren, die es Ihnen ermöglicht, sie zu erweitern. Wenn Sie das tun könnten, könnten Sie auch eines der Konstruktorpakete privat machen.

Es gibt auch dynamische Sprachen, die es Ihnen ermöglichen, die Unterklassen zu erstellen und eine Java-Schnittstelle zu implementieren, mit der der Java-Code interagieren kann, aber ich bin mit den Details nicht so vertraut.

1

Sie können die Klasse und einige oder alle Konstruktoren mit JMockit überspie- len.

Es ist ein spottendes Toolkit für Java, mit dem Sie fast alles überspielen können. Auch wenn die Klasse nicht öffentlich und/oder verschachtelt ist, kann sie dennoch verspottet werden. Es gibt mehrere Mechanismen in JMockit, die dafür verwendet werden können. Die Toolkit-Distribution enthält auch viele Beispiel-JUnit-Tests.

Wenn die Klasse eine Schnittstelle implementiert oder eine abstrakte Klasse erweitert, können Sie JMockit auffordern, Implementierungen des Basistyps bei Bedarf zu "erfassen" und zu imitieren, da sie von der JVM geladen werden Feld in der Testklasse.