2013-11-13 4 views
1

я написал несколько тестов Junit4, который выглядит следующим образом:Struts2 Junit4 тестов аккумулировать ответы JSON с каждым выполнением действия

public class TestCampaignList extends StrutsJUnit4TestCase<Object> { 

    public static final Logger LOG = Logger.getLogger(TestCampaignList.class.getName()); 

    @Before 
    public void loginAdmin() throws ServletException, UnsupportedEncodingException { 
     request.setParameter("email", "[email protected]"); 
     request.setParameter("password", "22"); 
     String response = executeAction("/login/admin"); 
     System.out.println("Login Response : " + response); 
    } 

    @Test 
    public void testList() throws Exception { 
     request.setParameter("iDisplayStart", "0"); 
     request.setParameter("iDisplayLength", "10"); 
     String response = executeAction("/campaign/list"); 
     System.out.println("Reponse : " + response); 

    } 
} 

Оба действия возвращают результаты в формате JSON и executeAction Javadoc говорит:

For this to work the configured result for the action needs to be FreeMarker, or Velocity (JSPs can be used with the Embedded JSP plugin) 

Похоже, что он не может обрабатывать результаты JSON и, следовательно, второе действие выполняет результат, полученный таким образом, что result_for_second_action= result1 concatenate result2

I там есть решение получить executeAction(), чтобы вернуть фактический ответ JSON, а не конкатенировать ответы JSON от всех предыдущих исполнений.

ответ

2

Это происходит потому, что вы выполняете действие в методе @Before. Таким образом, метод setUpStrutsJUnit4TestCase не вызывается между вашим loginAdmin и тестовым методом, и предыдущие параметры запроса передаются ему снова. Вы можете вызвать метод setUp самостоятельно в своем методе тестов. В вашем случае вы можете на самом деле вызвать метод initServletMockObjects для создания новых mock-объектов сервлетов, таких как запрос.

@Test 
public void testList() throws Exception { 
    setUp(); 
    // or 
    // initServletMockObjects(); 

    request.setParameter("iDisplayStart", "0"); 
    request.setParameter("iDisplayLength", "10"); 
    String response = executeAction("/campaign/list"); 
    System.out.println("Reponse : " + response); 

} 
+0

это решило проблему. Хотя я принял '@ Before' неправильно, он выполняется перед каждым тестом на самом деле. Я не могу использовать '@ BeforeClass' до того, как mock object' request' недоступен. Есть ли что-то, что я могу использовать только ОДИН РАЗ перед началом всех тестов? –

+0

@coding_idiot: не вызывать действие для входа вообще. Вместо этого логин логики без действия. –

Смежные вопросы