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を探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#でほかのファイルにある自作...
-
ひとつのファイルにクラスは1つ?
-
【ASP.NET MVC3】共通ビュークラス
-
内部クラスのインスタンスを外...
-
無名パッケージからのインポート
-
C++でfriendクラスにしているの...
-
エクセルVBAで、条件に一致する...
-
ワイルドカード<?>と型パラメー...
-
「タイプ初期化子が例外をスロ...
-
DirectX、DrawPrimitive、D3DPT...
-
パワーポイントのVBAでテキスト...
-
エクリプス コンテンツアシスト...
-
配列の重複する値とその個数を...
-
エクセルVBAでのwitheventsにつ...
-
VBAもしくはVB6:クラスの中で...
-
Excel VBA 定数にオブジェクト...
-
VBA 同じ名前のオブジェクトを...
-
VB.NET フォーム上に描いたグ...
-
AccessレポートのラベルをVBAで...
-
EXCEL VBAにて動的にCheckBOXを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
C#にて別クラスの関数を使いたい
-
クラス間でのデータ参照
-
ひとつのファイルにクラスは1つ?
-
c++,ある関数のクラスから別の...
-
構造 他のクラスの構造体を別...
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
C++でfriendクラスにしているの...
-
継承したクラス側のクラス名の取得
-
範囲外の数値を代入したらエラ...
-
import と extends について
-
visual studioのデザイナ画面で...
-
a href="..." とServlet
-
内部クラスのインスタンスを外...
-
親クラスから子クラスへアクセス。
-
C#でほかのファイルにある自作...
-
C# インターフェイスの実装
-
java-別クラスの変数の使い方を...
-
実行可能jarファイルのファイル...
おすすめ情報