Java 是否有一种方法可以轻松地只存根一组给定的方法?
我第一次尝试开发一个GUI应用程序(使用JavaFX和Oracle的JDK 8u25),我想测试这个应用程序 经过反复试验,我提出了这一基本设计,类似于MVP: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单击的元素上,代码
- 我使用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,测试这些片段的问题是它需要一个处于正确状态的应用程序
实例;如果我没有模仿的话,我会遇到一个非法状态异常的问题。。。我必须承认,我只真正了解单元测试!