Java 是否有一种方法可以轻松地只存根一组给定的方法?

Java 是否有一种方法可以轻松地只存根一组给定的方法?,java,javafx,mockito,java-8,stubbing,Java,Javafx,Mockito,Java 8,Stubbing,我第一次尝试开发一个GUI应用程序(使用JavaFX和Oracle的JDK 8u25),我想测试这个应用程序 经过反复试验,我提出了这一基本设计,类似于MVP: 我使用FXML 生成的“控制器”(JavaFX称之为控制器;据我所知,它实际上不是一个控制器)仅将UI事件委托给“演示者” “演示者”使用“视图”修改UI,该视图是一个具有单个实现的界面,该实现可以访问“控制器”的所有GUI元素 例如,对于带有“基类名称”的窗格,在id为myButton且动作事件为myButton单击的元素上,代码

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

经过反复试验,我提出了这一基本设计,类似于MVP:

  • 我使用FXML
  • 生成的“控制器”(JavaFX称之为控制器;据我所知,它实际上不是一个控制器)仅将UI事件委托给“演示者”
  • “演示者”使用“视图”修改UI,该视图是一个具有单个实现的界面,该实现可以访问“控制器”的所有GUI元素
例如,对于带有“基类名称”的
窗格
,在id为
myButton
且动作事件为
myButton单击的元素上,代码如下:

// 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
类实现
视图
类,并且从
视图
类继承的所有方法(并且只有它们)都被存根,例如:

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

但是我不想用手来做这个。。。这可能吗?

看起来您正在尝试在FooTest中结合单元测试和系统测试的元素。Mockito非常适合作为一个单元测试演示者,它只与定义良好的可模拟接口交互。为了简单地测试真正的部件是否能很好地装配在一起,您可能根本不想使用Mockito。@JeffBowman我真的不明白您的意思?我可以单独测试演示者,是的;你的意思是我应该单独测试ui/控制器交互吗?另外,如果我不使用mockito,我如何验证调用了正确的片段?是的,集中精力分别测试单独的片段。如果可能的话,测试状态(例如modifiableElement)而不仅仅是交互(通过Mockito),这可能比这里的单元测试更容易进行集成测试。@JeffBowman uhm,测试这些片段的问题是它需要一个处于正确状态的
应用程序
实例;如果我没有模仿的话,我会遇到一个非法状态异常的问题。。。我必须承认,我只真正了解单元测试!