@Test
  public void pickingCorrectViewInterface() {

    ViewWithMulitpleInterfaces view = new ViewWithMulitpleInterfaces();
    TestNullObjectPresenter presenter = new TestNullObjectPresenter();

    presenter.attachView(view);
    Assert.assertNotNull(presenter.getView());
    Assert.assertTrue(view == presenter.getView());

    presenter.detachView(false);
    Assert.assertNotNull(presenter.getView());
    Assert.assertFalse(presenter.getView() == view);

    // Invoke methods on proxy
    presenter.getView().showFoo(new TestData());
    presenter.getView().showThat();
  }
  @Test
  public void testAttachDetach() {

    TestNullObjectPresenter presenter = new TestNullObjectPresenter();

    try {
      // NullPointer exception should be thrown
      presenter.getView();
      Assert.fail("Nullpointer Exception should be thrown but haven't");
    } catch (NullPointerException e) {
      // Expected exception
    }

    TestView view =
        new TestView() {
          @Override
          public void showFoo(TestData data) {}

          @Override
          public void showThat() {}
        };

    presenter.attachView(view);
    Assert.assertNotNull(presenter.getView());
    Assert.assertTrue(presenter.getView() == view);

    // Test with retainInstance == false
    presenter.detachView(false);
    Assert.assertNotNull(presenter.getView());
    Assert.assertTrue(presenter.getView() != view); // Null Object view

    // Reattach real view
    presenter.attachView(view);
    Assert.assertNotNull(presenter.getView());
    Assert.assertTrue(presenter.getView() == view);

    // Test with retainInstance == true
    presenter.detachView(true);
    Assert.assertNotNull(presenter.getView());
    Assert.assertTrue(presenter.getView() != view); // Null Object view
  }