Java 如何为动作侦听器编写JUnit?

Java 如何为动作侦听器编写JUnit?,java,jsf,events,junit,listener,Java,Jsf,Events,Junit,Listener,我有一个带有按钮和一组单选按钮的表单(SelectOneRadio)。单击单选按钮时,将触发一个ajax事件,并为某些计算执行Java类中的侦听器 **//Xhtml** <p:selectOneRadio id="id_radio_group" value="#{bean.radioValue}"> <f:selectItem itemValue="a" itemLabel="a"></f:selectItem> <f:selectIt

我有一个带有按钮和一组单选按钮的表单(SelectOneRadio)。单击单选按钮时,将触发一个ajax事件,并为某些计算执行Java类中的侦听器

**//Xhtml**
<p:selectOneRadio id="id_radio_group" value="#{bean.radioValue}">
    <f:selectItem itemValue="a" itemLabel="a"></f:selectItem>
    <f:selectItem itemValue="b" itemLabel="b"></f:selectItem>
    <f:selectItem itemValue="c" itemLabel="c"></f:selectItem>
    <f:selectItem itemValue="d" itemLabel="d"></f:selectItem>
    <f:selectItem itemValue="e" itemLabel="e"></f:selectItem>
    <f:ajax event="change" listener="#{controller.recordSelectedRadio}"></f:ajax>
</p:selectOneRadio>

**// Controller**
public void recordSelectedRadio(AjaxBehaviorEvent event) {

    // Some logics to business specific
}
**//Xhtml**
**//控制器**
公共作废记录SelectedRadio(AjaxBehaviorEvent事件){
//与特定业务相关的一些逻辑
}
要在控制器中为recordSelectedRadio()编写Junit?我尝试创建新的AjaxBehaviorEvent对象。但是AjaxBehaviorEvent的构造函数要求提供2个参数UIComponent和Behavior。我可以将UIComponent作为SelectOneRadio获取。但我无法理解这种行为


关于如何为JSF的Ajax监听器编写JUnit有什么想法吗?

通常,我们会将每个职责的代码分成不同的层,您应该问问自己是否要测试某个动作监听器是否被调用(这或多或少是框架职责)或者更确切地说是这个动作监听器背后的业务逻辑(即业务责任)。用第二个答案回答这个问题,你应该重构你的代码,让动作监听器调用一个方法,这个方法可以在没有任何框架知识的情况下单独测试,并且只基于JSF控制器提供的输入数据。

如果你想测试事件处理程序将调用的逻辑,您可以通过委派业务逻辑来实现这一点。您不会直接在eventhandler recordSelectedRadio(…)中实现业务代码,而是创建一个新方法myBusinessCode(),并从recordSelectedRadio(…)调用它。然后可以从TestCase调用相同的方法

实际上,更好的设计是使用包含BusinessLogic的BusinessObjects将BusinessLogic与UI控制器分离。这样做不仅是为了使业务逻辑可测试,还将从业务层分离GUI层。理论上,这种分离甚至应该使您能够在不更改业务逻辑的情况下更改GUI框架

但我认为你真正想做的是前端测试。无法使用JUnit测试单选按钮等的行为。有一个名为JSFUnit的工具可以帮助您。一个典型的UI测试工具是selenium