Hier ist ein Codeschnipsel:
%Vor%Nehmen wir an, ich teste die PlaceGamePiece-Methode (mit junit) und muss auf das m_theGameBoard zugreifen, damit ich es ansehen und überprüfen kann, ob das GamePiece auf dem richtigen Quadrat platziert wurde und die richtigen Daten enthält.
In C ++ würde ich entweder die Testklasse zu einem Freund machen, damit sie auf das private Mitglied m_theGameBoard zugreifen kann, oder ich hätte eine Funktion, die ein const GameBoard zurückgibt, das nicht geändert werden kann (weil es const ist):
%Vor%Jetzt kann ich tun, was immer ich auf dem Spielbrett überprüfen möchte, aber ich kann das Spielfeld nicht verändern, weil es const ist.
Java unterstützt keine Rückgabe von Const-Referenzen oder Friend-Klassen. Also meine Frage ist, was ist der Standard-Java-Weg, dies zu tun? Muss ich nur ein paar Get-Accessoren bereitstellen, mit denen ich die Daten von Square
überprüfen kann?
UPDATE: Ich habe am Ende eine GetPiece-Methode geschrieben, wie Kaleb Brassee vorgeschlagen hat.
%Vor%Hinweis Ich erstelle ein neues GamePiece-Objekt und gebe das zurück. Ich gebe den GameBoards-internen Verweis nicht zurück, deshalb kann niemand das Spielbrett verändern, weil sie nur eine Kopie haben! Nett! Danke für die Hilfe Jungs, ein paar wirklich gute Ratschläge.
Zu Ihrer Information: Ich ändere die Namen der Objekte, wenn ich sie hier poste, tut mir leid, wenn das irgendjemanden verwirrt hat.
Definieren Sie die Variable als protected
, damit der Einheitentest, wenn er sich im selben Paket befindet, darauf zugreifen kann.
Allerdings würde ich einfach eine öffentliche Methode getPiece(int row, int col)
hinzufügen, die das Stück auf diesem Quadrat zurückgibt (oder null, wenn es dort kein Stück gibt). Es ist wahrscheinlich, dass Sie eine Methode wie diese sowieso brauchen, und Sie könnten es in Ihren Tests verwenden.
Der Standardzugriffsmodifizierer für eine Methode oder Eigenschaft ist "paketgeschützt", dh "nur in meinem Paket sichtbar". Daher können Sie die Semantik von "Freundschaft" emulieren, während Sie eine separate Codebasis für Tests beibehalten, indem Sie zwei unterschiedliche Quellordner mit derselben Paketstruktur verwenden.
%Vor%Dann in MyClass.java
%Vor%Das ist in keiner Hinsicht ideal, aber es ist eine Möglichkeit, das zu tun.
Ja. Ihre Entscheidungen im Grunde laufen auf entweder mit:
%Vor%oder verwenden Sie eine der Java-Sammlungen, die Sie dann durch Collections.unmodiableList (...)
übergeben können(Beachten Sie, dass Sie bei Verwendung einer mehrdimensionalen Liste darauf achten sollten, die inneren Listen ebenfalls zu umbrechen, um sicherzustellen, dass sie auch nicht geändert werden können)
Wenn dies nur zum Testen verwendet wird, können Sie auch eine Funktion erstellen, die eine tiefe Kopie des Arrays zurückgibt.