æåã«ãåã®èšäºã§èª¬æããããã«ããã¬ãŒã³ããŒã·ã§ã³ãšãã¬ãŒã³ã¿ãŒãäœæããŸããã
衚瀺ãã
åœç¶ã®ããšãªãããç§ã®èãã¯Activityã¯ã©ã¹ã®ç¶æ¿è ããŸãã¯ãããRoboActivityã§ããããã«ã€ããŠç°¡åã«èª¬æããŸãã 以äžã¯ãã¢ã©ãŒã èšå®ã®ç·šéãŠã£ã³ããŠã®éåžžã«ç¹åŸŽçãªãœãŒã¹ã§ãã
public class AlarmEdit extends RoboActivity implements IAlarmEdit { @InjectView(R.id.ae_et_AlarmName) EditText etName; @Inject AlarmEditPresenter presenter; @InjectView(R.id.ae_btn_Save) Button btnSave; @InjectView(R.id.ae_btn_Cancel) Button btnCancel; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.alarm_edit); presenter.onCreate(this); btnSave.setOnClickListener(this); btnCancel.setOnClickListener(this); } @Override public void onClick(View btn) { AlarmEdit.ClickSourceItem clickItem = AlarmEdit.ClickSourceItem.CANCEL; switch (btn.getId()) { case R.id.ae_btn_Save: clickItem = AlarmEdit.ClickSourceItem.SAVE; break; case R.id.ae_btn_Cancel: clickItem = AlarmEdit.ClickSourceItem.CANCEL; break; } presenter.onClick(clickItem); } @Override public String getAlarmName() { return etName.getText().toString(); } @Override public void setAlarmName(String alarmName) { etName.setText(alarmName); } @Override public Bundle getViewBundle() { return getIntent().getExtras(); } }
ããã§ããã®äŸãæ€èšãå§ããŸãã
ãŸããRoboActivityãšã¯äœãããªãããã§å¿ èŠãªã®ãã RoboActivityã¯RoboGuiceã®äžéšã§ãã RoboGuiceã¯ãAndroidçšã®äŸåæ§æ³šå ¥ãã¬ãŒã ã¯ãŒã¯ã§ãã
RoboGuiceã®è©³çŽ°ã«ã€ããŠã¯ããããžã§ã¯ãã®Webãµã€ããã芧ãã ããã
code.google.com/p/roboguice/wiki/SimpleExample?tm=6
ãã®ã¯ã©ã¹ã§ã¯ãRoboGuiceã䜿çšããŠãonCreateã¡ãœããã®éå±ããåé¿ããŠããŸãã
etName = (EditText) findViewById(R.id.ae_et_AlarmName);
RoboGuiceã¯ãã¢ã¯ãã£ããã£ãäœæãã Injectã¿ã°ã䜿çšããŠæååãåŠçãããšãã«ãã¹ãŠãè¡ããŸã...
@InjectView(R.id.ae_et_AlarmName) EditText etName;
次ã®ããã«ãªãœãŒã¹ã«ååãä»ããŸãã
<ç¥ ã¢ã¯ãã£ããã£å> _ <abbrã ã³ã³ãããŒã«ã¿ã€ãã®åå> _ <ã³ã³ãããŒã«ã®åå>
ã¢ããªã±ãŒã·ã§ã³å šäœããåäžã®ãR.idãåå空éã«ç©ã¿äžãããã倧éã®ãªãœãŒã¹èå¥åéãç°¡åã«ç§»åã§ããŸãã
ãŸããRoboGuiceã䜿çšããŠã次ã®å®£èšãéããŠãã¬ãŒã³ã¿ãŒãäœæããŸãã
@Inject AlarmEditPresenter presenter;
å®éãRoboGuiceã«ã¯ãããšã§çŽ¹ä»ããããã€ãã®çšéããããŸãã
ãããã£ãŠãonCreateïŒïŒã¡ãœããã®å®è¡æã«ãã¯ã©ã¹å ã®ãã¹ãŠã®ãã£ãŒã«ãã¯ãã§ã«åæåãããŠãããåå¥ã«åæåãè¡ãå¿ èŠã¯ãããŸãããã³ãŒãã¯ãããã«èŠããŸãã
onCreateïŒïŒã¡ãœããã§ã¯ãçŸåšã®ã¯ã©ã¹ãOnClickListenerãšããŠç»é²ãããã®ãã¥ãŒã¯ã©ã¹ãžã®åç §ããã¬ãŒã³ã¿ãŒã«æž¡ãã ãã§ãå°æ¥ãã¬ãŒã³ã¿ãŒããã¥ãŒã®ããããã£ãå¶åŸ¡ã§ããããã«ããŸãã ããã«ãããçºè¡šè ã®ããžãã¹ããžãã¯ããã¬ãŒã³ããŒã·ã§ã³ãå¶åŸ¡ãããšãã«ãå¶åŸ¡ã®å転ãååŸãããŸãã
ããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåã«åŒ±ãäŸåããŠããå¥ã®ãã¬ãŒã³ã¿ãŒã¯ã©ã¹ã«éäžããŠããããžãã¹ããžãã¯ããã¹ãããããã«è¡ããŸãã ããã«ããã¹ãäžã«ãã¬ãŒã³ã¿ãŒãããã°ã©ã ç°å¢ããåãé¢ããä»ã®ã³ã³ããŒãã³ãã®ä»£ããã«ããŸããŸãªã¹ã¿ããšã·ãã¥ã¬ãŒã·ã§ã³ãæ¥ç¶ãããã¬ãŒã³ã¿ãŒã§ãã¹ããå®è¡ããæ¹æ³ã瀺ããŸãã
onClickïŒïŒã¡ãœããã¯ããã¥ãŒããŠãŒã¶ãŒããåãåããã¹ãŠã®ã³ãã³ãããã¬ãŒã³ã¿ãŒã«æž¡ãããããšã瀺ããŸãã ããã§ã¯ããã¿ã³ã®èå¥åãã³ãã³ãã«å€æããã ããªã®ã§ããããã°æã«R.idã¯ã©ã¹ã®ãªãœãŒã¹ã«å¯Ÿå¿ããçªå·ã§ã¯ãªãã³ãã³ãã®ååã衚瀺ãããŸããéåžžããã¥ãŒãããã¬ãŒã³ã¿ãŒã«äœããè¿œå ãã䟡å€ã¯ãããŸããã
ããã§ã¯ããã¥ãŒã¯ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããã«ãã¬ãŒã³ã¿ãŒãšçŽæ¥éä¿¡ããŸãã ãã¬ãŒã³ã¿ãŒãæš¡å£ã«çœ®ãæããå¿ èŠããªãããããããè¡ããŸããã åäœãã¹ãã§ã¯ããã©ãŒãã³ã¹ããã¹ãããŸããã
setAlarmNameïŒïŒããã³getAlarmNameïŒïŒã¡ãœããã¯ããã¬ãŒã³ã¿ãŒãç·šéãŠã£ã³ããŠã«ã¢ã©ãŒã ã®ååã衚瀺ããã³ååŸããããã«äœ¿çšããŸãã
getViewBundleïŒïŒã¡ãœããã¯ãIntentãä»ããŠæž¡ãç·šéå¯èœãªã¢ã©ãŒã ã®IDãååŸããããã«å¿ èŠã§ãã ç®èŠãŸãæèšèªäœã¯ããªããžããªãããŒãããã¢ãã«ããååŸããããã¹ãŠã®ç®èŠãŸãæèšã¯ã¢ãã«ã«ããŸãããŒããããªããããäžåºŠã«ã¢ãã«ã«ããŒããããŸãã ã¢ãã«ã¯ããã°ã©ã ã®æåã®ã¢ã¯ãã£ããã£ã§èªã¿èŸŒãŸããã¢ã©ãŒã ã®ãªã¹ããããããã¹ãŠã®ã¢ã©ãŒã ãå«ãã¢ãã«ããã§ã«å¿ èŠã§ãã
Roboguiceã䜿çšãããããã§ãSingletonã¢ãã«ãã§ããŸããã ã€ãŸããã¢ããªã±ãŒã·ã§ã³å šäœã§ã¢ãã«ã®ã€ã³ã¹ã¿ã³ã¹ã1ã€ãããã¢ã¯ãã£ããã£ããã¢ã¯ãã£ããã£ã«ã¢ãã«ã転éããå¿ èŠã¯ãããŸããã åã¢ã¯ãã£ããã£ã®ãã¬ãŒã³ã¿ãŒã¯ãRââoboguiceããã¢ãã«ãåãåããŸãã
@Inject IAlarmListModel alarmListModel;
Singletonã¯éçã¯ã©ã¹ã§ã¯ãªãRoboGuiceãä»ããŠå®è£ ãããŠããããããã¹ãã®ã¢ãã«ãå¿ èŠãªã·ãã¥ã¬ãŒã·ã§ã³ã«çœ®ãæããããšãã§ããŸãã
ãããšã€ã³ã¿ãŒãã§ã€ã¹ã«è¡šç€ºãããŠããã³ãŒãã¯ãMVPã䜿çšããŠèšè¿°ããå¿ èŠãããè¿œå ã®ã³ãŒãã§ãã ãã¬ãŒã³ã¿ãŒã«ããæ®ãã®ã³ãŒãã¯ãã¹ãŠãå¿ èŠãªããžãã¹ããžãã¯ãå«ãŸããŠããããããšã«ããèšè¿°ããå¿ èŠããããŸãã
èšãæããã°ãMVPã®æéã¯æ°è¡ã®ãããã³ã°ã§ãããããã¯MVPã䜿çšããå Žåã«åŸããããã®ãšã¯ããŸãæ¯èŒãããŠããŸããã
ã€ã³ã¿ãŒãã§ã€ã¹IAlarmEdit
ã€ã³ã¿ãŒãã§ã€ã¹ã¯éåžžã«åçŽã§ãã¡ãœãããå«ãŸããŠããã ããªã®ã§ããã¬ãŒã³ã¿ãŒã¯ãã¥ãŒãšéä¿¡ãããããã¥ãŒããã¹ãã®ã·ãã¥ã¬ãŒã·ã§ã³ã«çœ®ãæãããã§ããŸãã
public interface IAlarmEdit { public enum ClickSourceItem { SAVE, CANCEL } public abstract String getAlarmName(); public abstract void setAlarmName(String alarmName); public abstract Bundle getViewBundle() }
ãã¬ãŒã³ã¿ãŒã¯ã©ãã§ãã
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ãéå§ãããã¬ãŒãããã°ã©ã ã奜ããªäººã¯ããªãã®ã§ãã§ããã ãéããããã£ãã æåã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãèªã¿èŸŒãŸãªãããã«ãã§ããã ãå€ãã®ããžãã¯ããµãŒãã¹ã«éäžããããšãèšç»ããŸããã ãããããã®åŸããµãŒãã¹ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãšåãã¹ã¬ããã§å®è¡ãããããšãçºèŠããŸããã ãŸããåã ã®ã¹ã¬ããã䜿çšããå ŽåãAsyncTaskã«ã¯çŽ æŽãããç¹ããããŸãã ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãšãµãŒãã¹ã®äž¡æ¹ã§ãããã°ã©ã ã§ãã«ãã¹ã¬ãããäœæããã®ã¯åœŒå¥³ãéããŠã§ããã
ãã®ããããã¬ãŒã³ã¿ãŒã«ã¯IModelLoaderã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ããããŸãããã®ã¯ã©ã¹ã¯ããªããžããªãéåæçã«åŒã³åºããä¿åçšã®ã¢ãã«ãæž¡ããŸãã 次ã®èšäºã§éåæèªã¿åã/ããŠã³ããŒãã«ã€ããŠè©³ãã説æããŸãã
public class AlarmEditPresenter implements IModelReciver { @Inject public IModelLoader modelSaver; private int id; private AlarmEdit view; public void onCreate(IAlarmEdit alarmEdit) { // , // this.view = alarmEdit; // id Bundle bundle = view.getViewBundle(); id = bundle.getInt(MainScreenPresenter.BUNDLE_ARG_ALARM_ID); // , // , // . alarmListModel.takeAlarmForEdit(id); // view.setAlarmName(alarmListModel.getEditingAlarm().getName()); // , // modelSaver.setReciver(this); } public void onClick(AlarmEdit.ClickSourceItem clickItem) { switch(clickItem) { case SAVE: // , alarmListModel.getEditingAlarm().setName(view.getAlarmName()); // alarmListModel.updateAlarm(alarmListModel.getEditingAlarm()); // . modelSaver.saveModel(); // . // . break; case CANCEL: // . view.setResult(Activity.RESULT_CANCELED); view.finish(); break; } } @Override public void update(String event) { if(event.equals(IModelLoader.EVENT_ALARM_MODEL_SAVE)) { // , . // . view.setResult(Activity.RESULT_OK); view.finish(); } } }
å®éããã®ãã¬ãŒã³ã¿ãŒã«ã¯ãŸã å€ãã®ã³ãŒãããããŸãããMVPã®èŠ³ç¹ããæ°ãããã®ã¯ãªããããåŒçšããŸããã§ããã
ãã¬ãŒã³ã¿ãŒã«ã¯ããã®ãããªã¯ã©ã¹ã®ã¡ã³ããŒãããããšã«æ³šæããŠãã ããã
@Inject private IDateHolder dateHolder;
ãã¹ãã§å¿ èŠãªæéãšãã±ãŒã«ãã·ãã¥ã¬ãŒãããããã«IDateHolderãå¿ èŠã§ããå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãRoboguiceã¯ã·ã¹ãã ã®æéãšãã±ãŒã«ãè¿ãã¯ã©ã¹ã«çœ®ãæããŸãã
ç¹ã«ãã¡ã€ã³ãŠã£ã³ããŠã«ã¯çŸåšã®æå»ã衚瀺ãããŸããããã¯ãçŸåšã®ãã±ãŒã«ã®æå»ã衚瀺ããè¡ã§ãã å¿ èŠãªæéãšãã±ãŒã«ãã·ãã¥ã¬ãŒãããæ£ãããã±ãŒã«ã®è¡ããã¥ãŒã«å ¥ã£ãããšã確èªãããã¹ãããããŸãã ãããã®ãã¹ãã®ãããã§ãç§ã®ããã°ã©ã ã¯ç°ãªããã±ãŒã«ã§æ£ããåäœããã¯ãã§ãã
ãã¬ãŒã³ã¿ãŒãã¹ã
ãã¬ãŒã³ã¿ãŒã§ã¯ãä»ã®ã³ã³ããŒãã³ããšã®ãã¹ãŠã®éä¿¡ãã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠè¡ãããããããããã®ã€ã³ã¿ãŒãã§ã€ã¹ããã¹ãã§ã·ãã¥ã¬ãŒãã§ããŸãã ç§ã¯ä»äœãããã€ããã§ãã
ãã®ãã¹ãã«ã¯ãAlarmEditPresenterããã§ãã¯ããã¿ã¹ã¯ããããŸãã ãã©ãŒã ããIDãååŸããã¢ãã«ããç®çã®ã¢ã©ãŒã ãååŸãããã®ååãç·šéã³ã³ãããŒã«ã«æ£ãã衚瀺ããŠããããšã確èªããå¿ èŠããããŸãã
public class TestAlarmEditPresenter extends RoboUnitTestCase<TestApplication> { public class AlarmEditModule extends AbstractAndroidModule { // presenter- // RoboGuice presenter // @Override protected void configure() { bind(AlarmEditPresenter.class); bind(IAlarmListModel.class) .toProvider(AlarmListModelProvider.class); } } private IAlarmListModel model; @Override protected void setUp() throws Exception { TestApplication.alarmTestModule = new AlarmEditModule(); super.setUp(); model = AndroidMock.createNiceMock(IAlarmListModel.class); AlarmListModelProvider.alarmListModel = model; } // private void initializeTest() { AndroidMock.reset(model); } /** * View * @throws Exception */ @MediumTest public void testAlarmEditOpen() throws Exception { initializeTest(); AlarmItem alarm = new AlarmItem(); alarm.setName("Test Name"); //, 2 model.takeAlarmForEdit(2); // , presenter AndroidMock.expect(model.getEditingAlarm()).andStubReturn(alarm); AndroidMock.replay(model); // Intent //, 2 Bundle bundle = new Bundle(); bundle.putInt(MainScreenPresenter.BUNDLE_ARG_ALARM_ID, 2); AlarmEdit view = AndroidMock.createMock(AlarmEdit.class); AndroidMock.expect(view.getViewBundle()).andStubReturn(bundle); // View view.setAlarmName("Test Name"); AndroidMock.replay(view); // presenter AlarmEditPresenter presenter = getInjector().getInstance(AlarmEditPresenter.class); // presenter.onCreate(view); //, , AndroidMock.verify(view); //, AndroidMock.verify(model); } }
ãã¹ããããAlarmEditModuleã¯ã©ã¹ãšãã®configureïŒïŒã¡ãœããã«ã€ããŠã¯ã次ã®èšäºãèªãã§ãRoboGuiceã®äœ¿çšã«ã€ããŠè©³ããèŠãŠãããŸãã
setUpïŒïŒã¡ãœããã§ãã·ãã¥ã¬ãŒã·ã§ã³ãäœæããŠãããã€ããŒã«é 眮ããŸãã äžè¬ã«ããªããããã€ããŒãå¿ èŠãªã®ã§ãããããã§ã次ã®åé¡ã解決ããŸãã Injectå±æ§ã§ããŒã¯ããããã£ãŒã«ããåæåãããšããå¿ èŠãªã·ãã¥ã¬ãŒã·ã§ã³ã眮ãæããå¿ èŠããããŸãã ãã£ãŒã«ãã¿ã€ãå¥ã®RoboGuiceã§ã¯ããã®ãããªãããã€ããŒïŒconfigureïŒïŒã¡ãœãããåç §ïŒã䜿çšããå¿ èŠãããããšãããããŸãããã®ãããã€ããŒãä»ããŠãå¿ èŠãªã·ãã¥ã¬ãŒã·ã§ã³ã眮ãæããŸãã
åãã¹ãã®åã«å®è¡ãããinitializeTestïŒïŒã¡ãœããã§ã¯ãä»ã®ãã¹ãã®åŸã«ãã¹ãŠã®ã·ãã¥ã¬ãŒã·ã§ã³ã®ç¶æ ãã¯ãªã¢ããŠããã¹ãã確å®ã«åé¢ãããããã«ããŸãã
ãã¹ãèªäœã§ã¯ãæåã«ã·ãã¥ã¬ãŒã·ã§ã³ãæºåããŸãã
ã¢ã©ãŒã ãäœæãããã¬ãŒã³ã¿ãŒãç·šéå¯èœãªã¢ã©ãŒã ãèŠæ±ããå Žåããã®æºåãããã¢ã©ãŒã ã圌ã«è¿ãããã«ã·ãã¥ã¬ãŒããããã¢ãã«ã«äŒããŸãã
AndroidMock.expect(view.getViewBundle()).andStubReturn(bundle);
ãŸããç¹å®ã®åŒã³åºããæåŸ ãããããšã瀺ããŸãã
//, 2 model.takeAlarmForEdit(2); ..... // View view.setAlarmName("Test Name");
ãã®åŸãRoboGuiceãä»ããŠAlarmEditPresenterã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããŸãã å¿ ãRoboGuiceã䜿çšããŠäœæãã Injectå±æ§ã§ããŒã¯ããããã¹ãŠã®ãã£ãŒã«ãã«å¿ èŠãªå€ãå ¥åãããããã«ããŠãã ããã
次ã«ãã¡ãœããpresenter.onCreateïŒviewïŒãåŒã³åºããŸãããã®ã¡ãœããã§ã¯ãã¢ã©ãŒã ãããŒãããããã®ååããã¥ãŒã«è»¢éãããŸãã
ãããŠæåŸã«ããã¬ãŒã³ã¿ãŒãå¿ èŠãªãã¹ãŠã®åŒã³åºããè¡ã£ãããšã確èªããŸãã
//, , AndroidMock.verify(view); //, AndroidMock.verify(model);
æ®ãã®è©³çŽ°ãæ確ã«ããããã«ã以äžã«ã€ããŠã話ããŸãã
AndroidMock
ããã¯ãã·ãã¥ã¬ãŒã·ã§ã³ãäœæããããã®ãã¬ãŒã ã¯ãŒã¯ã§ãã 詳现ã«ã€ããŠã¯ãã¡ããã芧ãã ããã
code.google.com/p/android-mock
ããã§ã¯ãAndroidMockã®äžè¬çãªæŠèŠãšããããžã§ã¯ãã§äœ¿çšããAndroidMockã®æ©èœã«ã€ããŠèª¬æããŸãã
ãã¹ãŠã®Mock Frameworkããã³ãã¹ãŠã®èšèªã¯ã次ã®ç®çã§èšèšãããŠããŸãã
ãŸããç¹å®ã®ã€ã³ã¿ãŒãã§ã€ã¹ãŸãã¯ã¯ã©ã¹ãæš¡å£ããŸãã ã·ãã¥ã¬ãŒã·ã§ã³ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãŸãã¯ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ãããå ã®ã€ã³ã¿ãŒãã§ã€ã¹ãŸãã¯ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãå¿ èŠãªãã¹ãŠã®ã¡ãœããã«æž¡ãããšãã§ããŸãã äœæçŽåŸã®æš¡å£ã«ã¯ãã¿ã€ãã«å¿ããŠ0ãŸãã¯nullã®å€ããããŸããããã¹ãŠã®ãã£ãŒã«ãããããã¿ã€ãã«å¿ããŠ0ãŸãã¯nullã§ãããã¡ãœãããåŒã³åºãããšãã§ããŸãã
ã·ãã¥ã¬ãŒã·ã§ã³ã§äœãåŒã³åºãããããåé¡ã§ãªãå ŽåããŸãã¯ã·ãã¥ã¬ãŒã·ã§ã³ããã¹ãã§åã«äœ¿çšãããªããããã¹ãã¯ã©ã¹ãã·ãã¥ã¬ãŒã·ã§ã³ãªãã§äœæãããªãå Žåã空ã®ã·ãã¥ã¬ãŒã·ã§ã³ã1è¡ã§äœæãããäœæãããã¯ã©ã¹ã«æž¡ãããŸãã
第äºã«ã ã·ãã¥ã¬ãŒãããããã«ããã®ãããªã¡ãœãããžã®åŒã³åºããçºçããå Žåã«ãã®ãããªå€ãè¿ãããã«1è¡ã§æå®ã§ããŸãã äžèšã®äŸã§ã¯ãããã¯æ¬¡ã®è¡ã§ãã
AndroidMock.expect(view.getViewBundle()).andStubReturn(bundle);
éåžžããã®æš¡å£ã®å¯èœæ§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã¯ã©ã¹ã®æºåãæŽã£ãŠããªãå ŽåããŸãã¯ã¡ãœããã®æºåãæŽã£ãŠããå Žåã«äœ¿çšãããŸãããæ£ããæ©èœããããã«ã¯æºåã«æéãããããŸãã ãŸããéåžžã¯ãã¹ãã®å¯Ÿè±¡ã§ããªãã¡ãœããã®ããŒã¿ã®æºåã«ç ©ããããªãããã«ãè¿ãããçµæãåçŽã«ã·ãã¥ã¬ãŒãããæ¹ãç°¡åã§ãã
ã¡ãªã¿ã«ã2ã€ã®åŒã³åºããäºæ³ãããããããç°ãªãçµæãè¿ãå¿ èŠãããå Žåã次ã®ããã«èšè¿°ããŸãã
AndroidMock.expect(view.getViewBundle()).andReturn(bundle1); AndroidMock.expect(view.getViewBundle()).andReturn(bundle2);
第äžã«ã ã·ãã¥ã¬ãŒããããã¹ããå®è¡ããåŸãå¿ èŠãªåŒã³åºãã¯ãã¹ãŠå®äºããããå¿ èŠãªåŒã³åºãã¯å®äºããŠããªãããšã確èªã§ããŸãã
ç§ã®äŸã§ã¯ãããã¯æ¬¡ã®è¡ã§ãã
AndroidMock.verify(view);
圌女ã¯ãã§ãã¯ããŸãã è¡ã®åã«èšè¿°ããããã¹ãŠã®æåŸ
AndroidMock.replay(view);
å®çŸããã
ã¡ãœããåŒã³åºãã®äºå®ã ãã§ãªããã¡ãœãããæ£ããåŒæ°ã§åŒã³åºãããŠããããšã確èªããå¿ èŠããããŸãã
AndroidMock.expect(view.getViewBundle(1)).andReturn(bundle1); AndroidMock.expect(view.getViewBundle(2)).andReturn(bundle2);
ãã®å Žåãç°ãªãåŒæ°ã«å¯ŸããŠç°ãªãå€ãè¿ãããæ€èšŒäžã«ãæå®ãããåŒæ°ã§åŒã³åºãããã£ãããšãæ€èšŒã§ããŸãã
ã·ãã¥ã¬ãŒã·ã§ã³ãäœæããå Žåã3ã€ã®æ¹æ³ããããŸãã
AndroidMock.createNiceMockïŒïŒ -匱ãã·ãã¥ã¬ãŒã·ã§ã³ãäœæããŸãã ãã®ãã§ãã¯ã§ã¯ãè¿œå ã®ã¡ãœãããåŒã³åºãããããšã¯èæ ®ãããŸããã 宣èšãããã¡ãœããã®ã¿ãåŒã³åºãããŸãã éåžžã¯ãæ£ããã¡ãœãããåŒã³åºãããããšã远跡ããå¿ èŠãããå Žåã«äœ¿çšãããäœåãªã¡ãœãããããã°æããªãã
ã¯ã©ã¹ãäœæããããã ãã«ã·ãã¥ã¬ãŒã·ã§ã³ãå¿ èŠãªå Žåã¯ã匱ãã·ãã¥ã¬ãŒã·ã§ã³ã䜿çšãããã¹ãåŸã«ãã¹ããåŒã³åºãããšããããŸããã
AndroidMock.createMockïŒïŒ -éåžžã®ã·ãã¥ã¬ãŒã·ã§ã³ãäœæããŸãã å¿ èŠãªãã¹ãŠã®ã¡ãœãããåŒã³åºãããäžèŠãªã¡ãœãããåŒã³åºãããªãã£ãããšã確èªããŸãã ããã«ãããã³ãŒã«æ°ã確èªãããŸãã éåžžãæåŸ ãèšè¿°ãã1è¡ã¯1åã®åŒã³åºãã§ãã ããããandStubReturnïŒïŒã¡ãœããã䜿çšããå Žåãããã¯å€ãã®åŒã³åºãã«ãªããŸãã ãŸããç¹å®ã®ã³ãŒã«æ°ã衚瀺ããããšãã§ããŸãïŒandReturnïŒïŒãTimesïŒ3ïŒ;
AndroidMock.createStrcitMockïŒïŒ -å³å¯ãªã·ãã¥ã¬ãŒã·ã§ã³ãäœæããŸãã ãã®å Žåãã¡ãœããåŒã³åºãã®é åºããã§ãã¯ãããŸãã
詳现ãªãã«ãæ å ±ã¯ãAndroidMockããã³EasyMockãããžã§ã¯ãããŒãžã§èŠã€ããããšãã§ããŸãã
æ®å¿µãªãããAndroidMockã«ã¯é倧ãªæ¬ é¥ããããŸãã
MediaPlayerãªã©ã®çµã¿èŸŒã¿ã¯ã©ã¹ãæš¡å£ã§ããããšãçºè¡šãããŠããŸãããããã¯ããªãåã®ããšã§ãããææ°ããŒãžã§ã³ã®Android SDKã§ã¯æ©èœããŸããã
ã¡ã€ã³ã¯ã©ã¹ããå¿ èŠãªãã¹ãŠã®ã¡ãœãããå«ãç¬èªã®ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããå®éã®MediaPlayerã®ã€ã³ã¹ã¿ã³ã¹ãå«ã¿ãã€ã³ã¿ãŒãã§ã€ã¹ããã®ãã¹ãŠã®åŒã³åºããå®éã®ã¯ã©ã¹ã®ã¡ãœããã«ããããããã¥ãŒãäœæããå¿ èŠããããŸãã
ãã¹ãã§ã¯ãäœæããã€ã³ã¿ãŒãã§ã€ã¹ãã·ãã¥ã¬ãŒãããŸãã
ããã§ãã·ãã¥ã¬ãŒã·ã§ã³ãäœæããããã®å¥ã®ãã¬ãŒã ã¯ãŒã¯ãæ¢ããŸãã
ä»ã®èšäºãèªã
- ã¯ããã«
-MVPããã³åäœãã¹ãã ãžã§ãã€ã»ãŠã§ã€
-ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ããã¹ããAndroidMock
- ããŒã¿ã®ä¿åã ãã¡ã€ã³ã¢ãã«ããªããžããªãã·ã³ã°ã«ãã³ããã³BDD
-ãµãŒããŒåŽã®å®è£ ãRoboGuiceããã¹ã
-å°ããªã¿ã¹ã¯ãèšå®ããã®ã³ã°ãProGuard