2014-09-08 2 views
0

버튼과 라디오 버튼 그룹 (SelectOneRadio)이있는 폼이 있습니다. 라디오 버튼을 클릭하면 ajax 이벤트가 발생하고 자바 컨트롤러 클래스의 리스너가 일부 계산을 위해 실행됩니다.JUnit for Action 리스너를 작성하는 방법은 무엇입니까?

**//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 
} 

컨트롤러에 recordSelectedRadio()에 대해 Junit을 쓰려면? 새 AjaxBehaviorEvent 객체를 만들려고했습니다. 그러나 AjaxBehaviorEvent의 생성자는 UIComponent 및 Behavior라는 2 개의 매개 변수를 요구합니다. SelectOneRadio로 UIComponent를 가져올 수 있습니다. 하지만 나는 Behaviuor를 얻을 수 없었다.

JSF의 Ajax 리스너를 위해 JUnit을 작성하는 방법에 대한 아이디어가 있습니까?

답변

1

일반적으로 하나는 코드를 각각의 책임에 따라 서로 다른 레이어로 구분하기 때문에 특정 액션 리스너가 호출되는지 테스트해야하는지 (다소 프레임 워크 책임 임) 또는이 액션의이면에있는 비즈니스 로직 청취자 (사업상의 책임 임). 이 질문에 두 번째 대답으로 대답하려면 JSF 컨트롤러가 제공 한 입력 데이터를 기반으로 프레임 워크 지식없이 별도로 테스트 할 수있는 메소드를 액션 리스너가 호출하도록 코드를 리팩터링해야합니다.

1

이벤트 처리기에서 호출 할 논리를 테스트하려면 비즈니스 논리를 위임하여 수행 할 수 있습니다. eventhandler recordSelectedRadio (...)에 직접 비즈니스 코드를 구현하지 않고 대신 myBusinessCode() 메서드를 새로 만들고 recordSelectedRadio (...)에서 호출해야합니다. 그런 다음 동일한 메소드를 TestCase에서 호출 할 수 있습니다.

사실 더 나은 디자인은 BusinessLogic을 포함하는 BusinessObjects를 사용하여 UI 컨트롤러에서 비즈니스 로직을 분리하는 것입니다. 비즈니스 로직을 테스트 할 수있게하는 것뿐만 아니라 비즈니스 레이어에서 GUI 레이어를 분리합니다. 이론적으로이 분리는 비즈니스 로직을 변경하지 않고 GUI 프레임웍을 변경할 수도 있습니다.

하지만 실제로하고 싶은 것은 프런트 엔드 테스트입니다. JUnit을 사용하여 라디오 버튼 등의 동작을 테스트 할 수 없습니다. JSFUnit이라는 도구가 도움이 될 것입니다. UI를위한 고전적인 테스트 도구는 셀레늄입니다.

관련 문제