void save() {
    checkEditViewSet();
    if (bill == null) bill = new Bill();
    bill = editView.fillBill(bill);
    bill.setInitDate(initDate);
    bill.setEndDate(endDate);
    OperationResult result = repository.save(bill);

    if (result.isValid()) {
      editView.finishView();
    } else {
      for (ValidationError validationError : result.getErrors())
        editView.showError(validationError);
    }
  }
 void viewUpdated(boolean invalidateCache) {
   if (bill != null) {
     if (invalidateCache) bill = repository.find(bill.getUuid());
     if (editView != null) {
       editView.setTitle(R.string.edit_bill_title);
     } else {
       String title = view.getContext().getString(R.string.bill);
       view.setTitle(title.concat(" ").concat(bill.getName()));
     }
     view.showBill(bill);
     initDate = bill.getInitDate();
     if (editView != null) editView.onInitDateChanged(initDate);
     endDate = bill.getEndDate();
     if (editView != null) editView.onEndDateChanged(endDate);
   } else {
     if (editView != null) editView.setTitle(R.string.new_bill_title);
   }
 }
  @Test
  public void save_gets_data_from_screen_and_save_to_repository() {
    when(view.fillBill(any(Bill.class))).thenReturn(new Bill());
    when(repository.save(any(Bill.class))).thenReturn(new OperationResult());

    presenter.save();

    verify(view, times(1)).fillBill(any(Bill.class));
    verify(repository, times(1)).save(any(Bill.class));
    verify(view, times(1)).finishView();
  }
  @Test
  public void call_view_with_errors() {
    OperationResult result = new OperationResult();
    result.addError(ValidationError.NAME);

    when(view.fillBill(any(Bill.class))).thenReturn(new Bill());
    when(repository.save(any(Bill.class))).thenReturn(result);

    presenter.save();

    verify(view, times(1)).showError(ValidationError.NAME);
  }