私は簡単なゲームを作っており、モデルのセットアップやテストについていくつか質問しています!可能であればMVPパターンに従おうとしています。簡単なゲーム設定でAndroidモデル(MVP)を正しくテストするにはどうすればよいですか?
以下は、私のモデルクラスの一部を簡略化したもので、主に「ロジック」を扱っています。
public class GameManager implements LocationManagerDelegate {
private LocationManager mLocationManager;
private BattleManager mBattleManager;
public GameManager(Location initialLocation) {
mLocationManager = new LocationManager(initialLocation, self);
mBattleManager = new BattleManager();
}
public void setLocation(Location location) {
mLocationManager.setLocation(location);
}
public void handleLocationAction(Action action) {
if (action.type == BATTLE) {
mBattleManager.startBattle();
}
}
}
public class LocationManager {
private LocationManagerDelegate mDelegate;
private Location mLocation;
public LocationManager(Location initialLocation, LocationManagerDelegate delegate) {
mLocation = initialLocation;
mDelegate = delegate;
}
public void setLocation(Location location) {
mLocation = location;
Action action = location.getRandomAction();
mDelegate.handleLocationAction(action);
}
}
public interface LocationManagerDelegate {
void handleLocationAction(Action action);
}
public class BattleManager {
public BattleManager() {
}
public void startBattle() {
// Do stuff...
}
}
これらのクラスを正しくテストすることに興味があります。彼らは別のもので、必要な場合、私は代表団のためのモックインタフェースを使用することができます(つまりLocationManagerDelegate
)
しかし、何GameManager
について - 私は簡単にLocationManager
とBattleManager
をテストすることができますか?具体的なLocationManager
/BattleManager
のインスタンスをそれ自身のクラスに作成するので、GameManager
を使用してクラスからロジックの全体的なフローをテストしたい場合は、実際にGameManager
とLocationManager
/BattleManager
というロジックをテストします。私はそれを分割するきれいな方法を見つけることができません...
これはもっと正しいでしょうか?
public class GameManager implements LocationManagerDelegate {
private ILocationManager mLocationManager;
private IBattleManager mBattleManager;
public GameManager(Location initialLocation, ILocationManager locationManager, IBattleManager battleManager) {
mLocationManager = locationManager;
mLocationManager.setInitialLocation(initialLocation);
mLocationManager.setDelegate(this);
mBattleManager = battleManager;
mBattleManager.setDelegate(this);
}
public void setLocation(Location location) {
mLocationManager.setLocation(location);
}
public void handleLocationAction(Action action) {
if (action.type == BATTLE) {
mBattleManager.startBattle();
}
}
}
public interface ILocationManager {
void setInitialLocation(Location initialLocation);
void setDelegate(LocationManagerDelegate delegate);
void setLocation(Location location);
}
public class LocationManager implements ILocationManager {
private LocationManagerDelegate mDelegate;
private Location mLocation;
public void setInitialLocation(Location initialLocation) {
mLocation = initialLocation;
}
public void setDelegate(LocationManagerDelegate delegate) {
mDelegate = delegate;
}
public void setLocation(Location location) {
mLocation = location;
Action action = location.getRandomAction();
mDelegate.handleLocationAction(action);
}
}
public interface LocationManagerDelegate {
void handleLocationAction(Action action);
}
public interface IBattleManager {
void startBattle();
}
public class BattleManager implements IBattleManager {
public void startBattle() {
// Do stuff...
}
}
その後、我々は実際にGameManager
インスタンスを作成してどこに、我々のようなものを実行します。
ILocationManager locationManager = new LocationManager();
IBattleManager battleManager = new BattleManager();
Location initialLocation = ...;
GameManager manager = new GameManager(initialLocation, locationManager, battleManager);
をこれは私がLocationManager
/BattleManager
モックオブジェクトに配置することが可能になるだけでなく、このため、大きすぎるではないかもしれませんGameManager
クラスの「内部動作」の一部を公開しています。必ずしも私がこれらの他のマネージャークラスなどで渡す必要がある公開情報である必要はありません。
それでは、どうすればよいですか?何かご意見は!あなたは上記のアウトラインとしてこれは、依存関係
の
1.コンストラクタ・インジェクション: