2016-12-14 18 views
0

Я пытаюсь сделать модульное тестирование на функции queryInfo класса queryAction:как издеваются ServletActionContext.getRequest() с помощью JMockit

public class queryAction{ 
    public String queryInfo(){ 
    // do something... 
    // this line throw Exception 
    HttpServletRequest request = ServletActionContext.getRequest(); 
    String areaInfo = request.getParameter("paramJson"); 
    // do something... 
    } 
} 

, когда тестовый модуль работает, сообщает следующее сообщение об ошибке:

queryAction (com.huawei.provision.queryActionTest) Истекшее время: 0.047 sec < < < ОШИБКА! java.lang.NullPointerException: нуль в org.apache.struts2.ServletActionContext.getRequest (ServletActionContext.java:112)

И я посмотрел на некоторые вопросы и ответы, такие как one way using Mockito и another way using easymock Но я все еще доном Не знаю, как решить эту проблему на JMockit.

+0

Было бы полезно показать, что вы пробовали. Где ваша попытка провести единичный тест? – dcsohl

ответ

0

Я взял роскошь возврата areaInfo в queryInfo() для этого теста.

В вашем случае вы должны использовать @Mocked для обоих объектов и вернуть HttpServletRequest макет в звонок от ServletActionContext.getRequest() в ожидании.

package com.platypus; 

import static org.junit.Assert.assertEquals; 

import javax.servlet.http.HttpServletRequest; 

import org.junit.Test; 
import org.junit.runner.RunWith; 

import mockit.Expectations; 
import mockit.Mocked; 
import mockit.Tested; 
import mockit.integration.junit4.JMockit; 


@RunWith(JMockit.class) 
public class ServletActionContextTest 
{ 

    @Tested 
    private QueryAction queryAction; 

    @Mocked 
    private HttpServletRequest httpServletRequest; 
    @Mocked 
    private ServletActionContext servletActionContext; 

    @Test 
    public void test() 
      throws Exception 
    { 
     new Expectations(){{ 
      ServletActionContext.getRequest(); result = httpServletRequest; 
      httpServletRequest.getParameter("paramJson"); result = "foo"; 
     }}; 

     String queryInfo = queryAction.queryInfo(); 

     assertEquals("foo", queryInfo); 
    } 
} 
+0

Какова ваша причина заявить, что «подделка должна использоваться» для статических методов? В этих случаях вы все равно можете использовать '@ Mocked'. – dcsohl

+0

Для меня это своего рода эмпирическое правило, возможно, я должен переосмыслить его. – Alfergon

+0

Хороший вызов @dcsohl Нет необходимости подделывать;) – Alfergon