
public class Game {
// ゲームの状態
private enum GameState{
TITLE,
PLAYING,
GAMEOVER,
}
private GameState state;
}
上記のクラスに対して、JUnitのテストコードから、
メンバ変数のstateの値とenum定数 GameState.TITLEとの比較がしたいと思っています。
イメージとしては、
if(state == GameState.TITLE){
.....
}
のような形です。
GameStateがprivateで宣言されているため、テストコードからはリフレクションを使用すればアクセスできるのではないかと思っているのですが、ネストしたクラスにどのようにアクセスすればよいのかがわかりません。
テストコードにて、
Game game;
Class<? extends Game> c = game.getClass();
// GameState取得
Field e = c.getDeclaredField("GameState");
とすると、実行時にGameStateがないと言われてテストに失敗してしまします。
テストコードからGameStateにアクセスするにはどのようにすればよいのでしょうか?
No.3ベストアンサー
- 回答日時:
enumなのでClass#getEnumConstants()でenumクラスの要素の配列を得る方がシンプルか……
要素の特定は、宣言した名前を返すname()で返ってくる文字列と比較するか、
宣言順を変えることがないのならインデックスで指定(TITLEなら0)してもいいかも。
どちらにしてもGameStateという名前は使えないのでObjectとして受けて精々Enumにキャストするくらいしかないのは変わらない。
Object[] game_gamestate = null;
for (Class cls : Game.class.getDeclaredClasses()) {
if (! "GameState".equals(cls.getSimpleName())) continue;
game_gamestate = cls.getEnumConstants();
break;
}
Object game_gamestate_title = null;
for (Object o : game_gamestate) if (((Enum)o).name().equals("TITLE")) game_gamestate_title = o;
または
Object game_gamestate_title = game_gamestate[0];
No.2
- 回答日時:
> // Game.GameStateクラス内で定義されたTITLEというGame.GameState型の静的変数への参照を得る。
正確には、
// Game.GameStateクラス内で定義されたGame.GameState型の静的変数TITLEに代入されているインスタンスへの参照を得る。
でした。
No.1
- 回答日時:
Game.GameStateクラスはGameクラスのメンバーではあるがフィールドではない。
したがって、
> c.getDeclaredField("GameState");
では必要としているものを得ることはできない。
特にJUnit用のテストコードを書いたりはしないが、大雑把なサンプルを以下に示す。
import java.lang.reflect.Field;
public class GameTest {
public static void main(String[] args) throws Exception {
// Game.GameStateクラス内で定義されたTITLEというGame.GameState型の静的変数への参照を得る。
Object game_gamestate_title = null;
for (Class<?> cls : Game.class.getDeclaredClasses()) { // メンバーとして定義されたクラスのリストから
if (! "GameState".equals(cls.getSimpleName())) continue; // GameStateでなければ無視
game_gamestate_title = cls.getDeclaredField("TITLE").get(null);
break;
}
// Gameクラス内で定義されたstateというフィールドのFieldインスタンスを得る。
Field game_state = Game.class.getDeclaredField("state");
game_state.setAccessible(true); // privateフィールドへのアクセスに必要
// Gameインスタンスを生成しこれを使い何かを何かする。
Game game = new Game();
//... gameを使って何かを何か
// この時点でのstateの内容を得てGame.GameState.TITLEであることを表明する。
Object state = game_state.get(game);
assert(state == game_gamestate_title);
}
}
java -ea GameTestで実行すればstateがGame.GameState.TITLEでなければAssertionErrorを吐く。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 11:02
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 09:24
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/01/23 17:13
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラス間でのデータ参照
-
関数内の変数に<summary>コメン...
-
C# インターフェイスの実装
-
親クラスから子クラスへアクセス。
-
Java リフレクションについて
-
通常関数とメンバー関数のやり...
-
C++でfriendクラスにしているの...
-
final修飾子について
-
java-別クラスの変数の使い方を...
-
C#でほかのファイルにある自作...
-
継承したクラス側のクラス名の取得
-
内部クラスのスコープについて。
-
コンストラクタの記述について...
-
import と extends について
-
ひとつのファイルにクラスは1つ?
-
アップキャスト、ダウンキャス...
-
visual studioのデザイナ画面で...
-
Java
-
Eclipseを用いたJARファイル作...
-
C#にて別クラスの関数を使いたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
範囲外の数値を代入したらエラ...
-
c++,ある関数のクラスから別の...
-
クラス間でのデータ参照
-
無名パッケージからのインポート
-
構造 他のクラスの構造体を別...
-
C++でfriendクラスにしているの...
-
C#にて別クラスの関数を使いたい
-
visual studioのデザイナ画面で...
-
C#でほかのファイルにある自作...
-
継承したクラス側のクラス名の取得
-
内部クラスのインスタンスを外...
-
ひとつのファイルにクラスは1つ?
-
C#のクラスライブラリでメッセ...
-
Java リフレクションについて
-
C++/C#間での構造体の引き渡し...
-
a href="..." とServlet
-
親クラスから子クラスへアクセス。
-
import と extends について
-
Tomcatのpropertiesファイルの...
おすすめ情報