ServiceAsync serviceAsync = GWT.create(ServiceAsync.class);   @Inject ServiceAsync serviceAsync;  /** *    presenter'.   <a href="http://www.gwtproject.org/articles/mvp-architecture.html"> *   MVP  Google</a>  <a href="http://www.gwtproject.org/doc/latest/DevGuideMvpActivitiesAndPlaces.html"> *   Activity  Place</a>.         MVP.      , *  View     Presenter,       (,      *  View).   ,      callback'  View,      Presenter'  *  . * <p/> * <p/> * Use case  Presenter': * <p/> * Presenter'     -     Presenter'   *  EventBus,   Presenter'  (  inject).  , .. EventBus   *       Presenter'.  Presenter'     Activity. ({@link * BaseActivity ). */ public interface BasePresenter<V extends BasePresenter.View> { /** *  {@link View}  .         View.  * View Presenter     ,     .  ,      *   View,      View.   {@link View},   {@link IsWidget},  *     View   View. * * @return View. */ @NotNull V getWidget(); /** *  View  Presenter'. , ..    {@link #setPresenter(BasePresenter)}  *     Presenter'   View   Presenter'  . */ public interface View<T extends BasePresenter> extends IsWidget { /** * View    Presenter,       View    Presenter'.  *    set ,     Inject, .. 1) GIN     - *  View   Presenter  Presenter   View.     -  * . 2) ,    View Presenter      , .. View     * Presenter,      View,  Presenter    View,    * . * * @param presenter   Presenter   View. */ void setPresenter(@NotNull T presenter); } } 
 /** *  GWT RPC .  -  GWT RPC .  -      -  *   web.xml.     GWT RPC   Jetty     *  -        Jetty,     SyncProxy  *    Guice. */ private static final Map<Class<? extends BaseRemoteService>, Pair<Class<?>, String>> gwtRpcServlets = Collections .unmodifiableMap(new HashMap<Class<? extends BaseRemoteService>, Pair<Class<?>, String>>() { private static final long serialVersionUID = -2126682232601937926L; { put(StudentsServiceImpl.class, new Pair<Class<?>, String>(StudentsServiceAsync.class, "/GxtModule/students")); put(GroupsServiceImpl.class, new Pair<Class<?>, String>(GroupsServiceAsync.class, "/GxtModule/groups")); } });  for (Map.Entry<Class<? extends BaseRemoteService>, Pair<Class<?>, String>> entry : gwtRpcServlets .entrySet()) { // Cookie   ,    SyncProxy   , .. http   . //      (waitForInvocation = true). ,      -       . gwtRpcAsyncInstances.put(entry.getValue().getA(), SyncProxy.newProxyInstance(entry.getValue().getA(), URL_TO_SERVER, entry.getValue().getB(), true)); }   private boolean isInstantiable(Class<?> clazz) { if (clazz.isPrimitive()) { return true; } if (clazz.isArray()) { return isInstantiable(clazz.getComponentType()); } //   Serializable.class.isAssignableFrom(clazz) if (IsSerializable.class.isAssignableFrom(clazz) || Serializable.class.isAssignableFrom(clazz)) { return true; } return SerializabilityUtil.hasCustomFieldSerializer(clazz) != null; }  /** *  Presenter',    View.    . */ private static final Map<Class<? extends BasePresenter>, Pair<Class<? extends BasePresenter>, Class<? extends BasePresenter.View>>> presenters = Collections.unmodifiableMap(new HashMap<Class<? extends BasePresenter>, Pair<Class<? extends BasePresenter>, Class<? extends BasePresenter.View>>>() { private static final long serialVersionUID = 3512350621073004110L; private <T extends BasePresenter> void addPresenter(Class<T> presenterInterface, Class<? extends T> implementPresenter, Class<? extends BasePresenter.View<T>> viewClass) { if (!presenterInterface.isInterface()) { throw new IllegalArgumentException("Should be interface " + presenterInterface.getName()); } if (implementPresenter.isInterface()) { throw new IllegalArgumentException("Should be class " + implementPresenter.getName()); } put(presenterInterface, new Pair<Class<? extends BasePresenter>, Class<? extends BasePresenter.View>>(implementPresenter, viewClass)); } { addPresenter(StudentPresenter.class, StudentPresenterImpl.class, StudentPresenter.View.class); addPresenter(StudentsListPresenter.class, StudentsListPresenterImpl.class, StudentsListPresenter.View.class); addPresenter(MainWindowPresenter.class, MainWindowPresenterImpl.class, MainWindowPresenter.View.class); } });   injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { //     . for (Class gwtRpcAsyncClass : gwtRpcAsyncInstances.keySet()) { bind(gwtRpcAsyncClass).toInstance(getGwtRpc(gwtRpcAsyncClass)); } for (Map.Entry<Class<? extends BasePresenter>, Pair<Class<? extends BasePresenter>, Class<? extends BasePresenter.View>>> entry : presenters.entrySet()) { log.info("Bind View {}", entry.getValue().getB().getName()); bindMock(entry.getValue().getB()); log.info("Bind Presenter {} to implementation {} ", entry.getKey().getName(), entry.getValue().getA().getName()); bind(entry.getKey()).to((Class) entry.getValue().getA()).in(Singleton.class); } EventBus eventBus = new SimpleEventBus(); bind(EventBus.class).toInstance(eventBus); com.google.gwt.place.shared.PlaceController placeController = new com.google.gwt.place.shared.PlaceController( eventBus, new com.google.gwt.place.shared.PlaceController.Delegate() { //   Delegate, , .. Delegate    UI. }); bind(com.google.gwt.place.shared.PlaceController.class).toInstance(placeController); bind(ActivityMapper.class).to(ru.timreset.example.gxt.client.ActivityMapper.class).in(Singleton.class); bind(AcceptsOneWidget.class).to(ru.timreset.example.test.base.AcceptsOneWidget.class).in(Singleton.class); } /** *   mock        . * @param bindClass  mock . */ private void bindMock(Class bindClass) { Object bindObject = Mockito.mock(bindClass); bind(bindClass).toInstance(bindObject); } }); ActivityManager activityManager = new ActivityManager(getInstance(ActivityMapper.class), injector.getInstance( EventBus.class)); activityManager.setDisplay(getInstance(AcceptsOneWidget.class)); final PlaceHistoryHandler historyHandler = new PlaceHistoryHandler( new PlaceHistoryMapper(), new PlaceHistoryHandler.Historian() { //   Historian, , .. Historian    UI    . }); historyHandler.register(injector.getInstance(com.google.gwt.place.shared.PlaceController.class), injector.getInstance(EventBus.class), Place.NOWHERE); historyHandler.handleCurrentHistory();  /** * Presenter    .   // . */ public interface StudentPresenter extends BasePresenter<StudentPresenter.View> { /** *   Presenter'  . * * @param mode   Presenter'. * @param studentId id . * @param eventBus EventBus. * @param onReady Callback       Presenter'. */ void init(@NotNull Mode mode, @Nullable Integer studentId, @NotNull EventBus eventBus, @NotNull Command onReady); /** *   . * * @param student . */ void saveStudent(Student student); /** *    . * * @return true -  , false -  . */ boolean isEdit(); /** *    . */ void onEditStudent(); /** *    . * * @return  . */ Mode getMode(); /** *     . * * @return true -  , false -   . */ boolean isDirty(); /** *   Presenter'. */ enum Mode { /** * . */ VIEW, /** * . */ EDIT, /** * . */ CREATE; } interface View extends BasePresenter.View<StudentPresenter> { /** *    . * * @param student . */ void setStudent(Student student); /** *      . * * @return true -  , false -   . */ boolean isDirty(); } }  public interface StudentPresenter extends BasePresenter<StudentPresenter.View> { void init(@NotNull Mode mode, @Nullable Integer studentId, @NotNull EventBus eventBus, @NotNull Command onReady); boolean isDirty(); enum Mode { VIEW, EDIT, CREATE; } /** *     View  Presenter'. */ interface ViewPresenter extends BasePresenter.ViewPresenter{ void saveStudent(Student student); boolean isEdit(); void onEditStudent(); Mode getMode(); } interface View extends BasePresenter.View<StudentPresenter.ViewPresenter> { void setStudent(Student student); boolean isDirty(); } } 

 /** *    Place  . * * @param newPlace  Place. */ void goToWithAssert(Place newPlace) /** * ,     Place. ! Place     {@link * Object#equals(Object)}.      . * * @param expectedWhere   (Place). */ void assertWhere(Place expectedWhere); /** * ,    View  Presenter'. ..  ,       * Presenter. * * @param presenter Presenter, View      . */ void assertWhere(BasePresenter presenter);  @Test public void listStudent() { //  Presenter  . MainWindowPresenter mainWindowPresenter = getInstance(MainWindowPresenter.class); //  Presenter  . StudentsListPresenter studentsListPresenter = getInstance(StudentsListPresenter.class); //     . mainWindowPresenter.goToStudentsList(); // ,   . assertWhere(studentsListPresenter); //   . studentsListPresenter.getStudents(new PagingLoadConfigBean(0, 999), new ru.timreset.example.gxt.client.AsyncCallback<PagingLoadResult<Student>>() { @Override public void onSuccess(PagingLoadResult<Student> result) { //,   . Assert.assertFalse(result.getData().isEmpty()); } }); }  @Test public void editTest() { //  Presenter  . MainWindowPresenter mainWindowPresenter = getInstance(MainWindowPresenter.class); //  Presenter  . StudentsListPresenter studentsListPresenter = getInstance(StudentsListPresenter.class); //  Presenter  . StudentPresenter studentPresenter = getInstance(StudentPresenter.class); // View  . StudentPresenter.View studentView = getInstance(StudentPresenter.View.class); //   mainWindowPresenter.goToStudentsList(); // ,   .   Place  View. assertWhere(StudentsListPlace.buildList()); assertWhere(studentsListPresenter); //    . studentsListPresenter.onCreateStudent(); //     . assertWhere(StudentPlace.buildCreate()); //      . assertWhere(studentPresenter); //     . Assert.assertEquals(StudentPresenter.Mode.CREATE, studentPresenter.getMode()); //   ArgumentCaptor<Student> studentArgumentCaptor = ArgumentCaptor.forClass(Student.class); Mockito.verify(studentView).setStudent(studentArgumentCaptor.capture()); //  . Student student = studentArgumentCaptor.getValue(); student.setName("TEST_NAME"); student.setSurname("TEST_SURNAME"); student.setPatronymic("TEST_PATRONYMIC"); student.setBirthday(new Date()); student.setStudentType(StudentType.ABSENTED); //  studentPresenter.saveStudent(student); //      . assertWhere(StudentsListPlace.buildList()); assertWhere(studentsListPresenter); //    ,      . studentsListPresenter.getStudents(new PagingLoadConfigBean(0, 999), new ru.timreset.example.gxt.client.AsyncCallback<PagingLoadResult<Student>>() { @Override public void onSuccess(PagingLoadResult<Student> result) { Collection<Student> coll = Collections2.filter(result.getData(), new Predicate<Student>() { @Override public boolean apply(Student input) { return "TEST_NAME".equals(input.getName()); } }); //,   . Assert.assertEquals(1, coll.size()); } }); } Source: https://habr.com/ru/post/246285/
All Articles