有没有办法轻松存根一组给定的方法?

时间:2015-01-11 13:57:37

标签: java javafx mockito java-8 stubbing

我第一次尝试开发一个GUI应用程序(使用JavaFX和Oracle的JDK 8u25),我想要测试这个应用程序。

经过一番试验和错误后,我想出了一个类似于MVP的基本设计:

  • 我使用FXML;
  • 生成的"控制器" (正如JavaFX所说的那样;它实际上并不是我的有限知识)只将UI事件委托​​给一个"演示者&#34 ;;
  • "演示者"使用" view"修改UI,这是一个具有单个实现的接口,并且此实现可以访问" controller"的所有GUI元素。

例如,对于Pane"基类名称" Foo,对于标识为myButton的元素,其动作事件为myButtonWasClicked,代码如下:

// JavaFX controller
public class FooUi
{
    // Package private on purpose, so that the view can access it
    @FXML
    Button myButton;

    @FXML
    WhateverElement modifiableElement;

    @FXML
    public void myButtonWasClicked(final ActionEvent ignored)
    {
        presenter.processMyButtonWasClicked();
    }
}

// View interface
public interface FooView
{
    void updateSomethingOnGui();
}

// View implementation
public class DefaultFooView
    implements FooView
{
    @Override
    public void updateSomethingOnGui();
    {
        modifiableElemnt.modifyInSomeWay();
    }
}

// Presenter
public class FooPresenter
{
    public void processButtonWasClicked()
    {
        // whatever housekeeping, then
        view.updateSomethingOnGui();
    }
}

现在,我的问题在于测试...不是我无法测试它,我可以而且那是主要观点:

public final class FooTest
{
    private FooUi ui;
    private FooView view;
    private FooPresenter presenter;

    @BeforeMethod
    public void init()
    {
        // init ui, view, presenter with Mockito
    }

    @Test
    public void testMyButtonWasClicked()
    {
        final InOrder inOrder = inOrder(presenter, view);

        ui.myButtonWasClicked(mock(ActionEvent.class));

        inOrder.verify(presenter).processMyButtonWasClicked();
        inOrder.verify(view).updateSomethingOnGui();
        inOrder.verifyNoMoreInteractions();
    }
}

但要创建的类集很重。

我想做的是让Ui类实现View类,并且所有方法都继承自View只有他们,被存根,例如:

doNothing().when(ui).updateSomethingOnGui();

但是,我想必须手动执行此操作......这可能吗?

0 个答案:

没有答案