dポイントプレゼントキャンペーン実施中!

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にアクセスするにはどのようにすればよいのでしょうか?

A 回答 (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];
    • good
    • 0
この回答へのお礼

こちらのコードを参考にして、無事テストに成功しました。
大変勉強になりました。ありがとうございます。

お礼日時:2011/03/01 23:40

> // Game.GameStateクラス内で定義されたTITLEというGame.GameState型の静的変数への参照を得る。



正確には、
// Game.GameStateクラス内で定義されたGame.GameState型の静的変数TITLEに代入されているインスタンスへの参照を得る。
でした。
    • good
    • 0

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を吐く。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!