以下是一段代码:
//Game board is made up of Squares. A player can place GamePieces on a Square.
public class CheckersBoard
{
public boolean PlaceGamePiece(GamePiece gamePiece, int nRow, int nColumn) {
return m_theGameBoard[nRow][nColumn].PlaceGamePiece(gamePiece);
}
private Square[][] m_theGameBoard;
}
假设我正在测试PlaceGamePiece方法(使用junit),我需要访问m_theGameBoard,以便我可以查看它并验证GamePiece是否放置在正确的Square上并且具有正确的数据。
在C ++中,我要么让测试类成为朋友,以便它可以访问私有成员m_theGameBoard,或者我有一个函数返回一个无法修改的const GameBoard(因为它是const):
const GameBoard& GetGameBoard() const { return m_theGameBoard; }
现在我可以做任何检查我想在游戏板上做的事情,但我不能修改游戏板,因为它是常量。
Java不支持返回const引用或朋友类。所以我的问题是这样做的标准Java方法是什么?我是否必须提供一组get访问器,以便我检查Square
上的数据?
更新: 我最终写了一个像Kaleb Brasee建议的GetPiece方法。
public GamePiece GetGamePiece(Point pt) {
return new GamePiece(m_theGameBoard[pt.GetRow()][pt.GetColumn()]);
}
注意我创建了一个新的GamePiece对象并返回该对象。我没有返回GameBoards内部参考,因此没有人可以修改游戏板,因为他们只有副本!太好了!感谢帮助人员,一些非常好的建议。
仅供参考:当我在这里发布对象时,我会不断更改对象的名称,如果这让任何人感到困惑,那就很抱歉。
答案 0 :(得分:3)
将变量定义为protected
,这样如果单元测试在同一个包中,它就可以访问它。
但是,我只想添加一个公共方法getPiece(int row, int col)
,它返回该方块上的那个(如果那里没有任何一块,则返回null)。无论如何,您可能需要这样的方法,并且可以在测试中使用它。
答案 1 :(得分:2)
方法或属性的默认访问修饰符是“包受保护的”,这意味着“仅在我的包中可见”。因此,您可以模拟“友谊”的语义,同时为测试维护单独的代码库,具有两个不同的源文件夹,但具有相同的包结构。
src
|--com
|
--cchampion
|
--MyClass.java
tests
|--com
|
--cchampion
|
--TestMyClass.java
然后,在MyClass.java中
public class MyClass {
private int nonTestedThing;
int[][] testedThing; // this is visible to TestMyClass
// or
// protected int[][] testedThing;
// if you want it visible to kids
}
这在任何方面都不理想,但这是一种方法。
答案 2 :(得分:1)
是。您的选择基本上归结为:
Square getSquareAtLocation(int row, int col) { ... };
或使用其中一个Java集合,然后您可以通过Collections.unmodifiableList(...)
(请注意,如果您使用多维List,则必须小心包装内部列表以确保它们不可修改)
如果这只是用于测试,您还可以创建一个返回数组深层副本的函数。