これが私のMVPのやり方です。
ビューでプレゼンターにゲッターを呼び出す代わりに、ビューでプレゼンターのメソッドを呼び出します。このようにして、ビジネス ロジックはプレゼンターに分離され、ビューをモックすることなく簡単にテストできます。
public interface MyView extends View {
void setObjectsList(List<Object> objects);
void setPresenter(Presenter presenter);
interface Presenter {
void handleObjectSelected(Object object);
}
}
プレゼンターは MyView.Presenter を実装します。
class MyPresenter implements MyView.Presenter {
private final MyView myView;
private List<Object> objects;
public MyPresenter(MyView myView, List<Objects> objects) {
this.myView = myView;
this.objects = objects;
}
public void initialize() {
myView.setPresenter(this);
myView.setObjectsList(objects);
}
@Override
public void handleObjectSelected(Object object) {
// Do something with selected object.
}
}
MyView の実装例:
class MyViewImpl implements MyView {
private Presenter presenter;
...
@Override
public void setObjectsList(List<Object> objects) {
// Do something with object list.
}
@Override
public void setPresenter(Presenter presenter) {
this.presenter = presenter;
}
public void somethingHappened() {
presenter.handleObjectSelected(object);
}
}
ListBox を使用した MyView の 2 番目の実装例:
class ListBoxMyViewImpl implements MyView {
@UiField ListBox listBox;
private Presenter presenter;
private List<Object> objects;
public MyListBoxView() {
objects = Lists.newArrayLists();
}
@Override
public void setObjectsList(List<Object> objects) {
this.objects = objects;
listBox.clear();
for (Object object : objects) {
listBox.addItem(object.toString());
}
}
@Override
public void setPresenter(Presenter presenter) {
this.presenter = presenter;
}
@UiHandler("listBox")
void onChange(ChangeEvent e) {
presenter.handleObjectSelected(objects.get(listBox.getSelectedIndex());
}
...
}
この方法では、プレゼンター ロジックをテストするためにビューをモックする必要はありません。
それ以外の:
@Mock
MyView view;
List testValues = ...;
when(view.getValues().getValues()).thenReturn(testValues);
result = presenter.method(...);
assertTrue(result == expected);
プレゼンター ロジックをテストします。
List testValues = ...;
assertEquals(expected, presenter.method(testValues));