2016-12-04 159 views
1

我想为包含对Postgres数据库的调用的servlet编写单元测试。我嘲笑Connection,StatementResultSet类。但是,这些调用的任何方法调用给我一个MethodNotFoundException。有一些参考文献提到Java 8和PowerMock 1.5.x中有些功能被破坏,但我在PowerMock 1.6.6上。任何帮助,高度赞赏。org.powermock.reflect.exceptions.MethodNotFoundException: - 当模拟java sql类

下面的代码: 公共类CitiesServlet延伸的HttpServlet {

private static final Logger log = LoggerFactory.getLogger(CitiesServlet.class); 

@Override 
protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { 
    log.debug("doGet called on servlet=" + this.getClass()); 
    PrintWriter writer = ServletUtils.setResponseParametersAndGetPrinter(resp); 
    CitiesWrapperModel citiesWrapperModel = new CitiesWrapperModel(); 
    String message = ServletHelper.getInstance().openDBConnection("PgBundle"); 
    if (!message.startsWith("Servus")) { 
     writer.println("<h1>Database connection failed to open " + message + "</h1>"); 
     return; 
    } 
    CitiesData citiesData = new CitiesData(); 
    citiesData.setCities(getCities()); 
    citiesWrapperModel.setData(citiesData); 
    ServletUtils.writeResultsAndCloseStream(writer, citiesWrapperModel); 
} 

public List<String> getCities() { 
    List<String> cities = new ArrayList<>(); 

    String query = "SELECT * FROM cities"; 
    try { 
     Connection connection = ServletHelper.getInstance().getConnection(); 
     Statement st = connection.createStatement(); 
     ResultSet rs = st.executeQuery(query); 
     while (rs.next()) { 
      String cityName = rs.getString("cityName"); 
      cities.add(cityName); 
     } 
     st.close(); 
     rs.close(); 
    } catch (SQLException sqe) { 
     log.warn("SQL exception when accessing users table, sql message= " + sqe.getMessage()); 
    } 
    return cities; 
}} 

测试类:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ServletHelper.class, Statement.class, ResultSet.class, Connection.class}) 
public class CitiesServletITTest { 

private HttpServletRequest testRequest; 
private HttpServletResponse testResponse; 
private ServletHelper mockServletHelper; 
private Connection mockConnection; 
private CitiesServlet citiesServlet; 

@Before 
public void setUp(){ 
    citiesServlet = new CitiesServlet(); 
    testRequest = new TestHttpServletRequest(); 
    testResponse = new TestHttpServletResponse(); 
    mockServletHelper = mock(ServletHelper.class); 
    mockConnection = mock(Connection.class); 

} 

@Test 
public void canGetCitiesData() throws ServletException, IOException, SQLException { 
    PowerMockito.mockStatic(ServletHelper.class); 
    PowerMockito.when(ServletHelper.getInstance()).thenReturn(mockServletHelper); 
    when(mockServletHelper.openDBConnection(Mockito.anyString())).thenReturn("Servus"); 
    when(mockServletHelper.getConnection()).thenReturn(mockConnection); 


    ResultSet resultSet = Mockito.mock(ResultSet.class); 
    Mockito.when(resultSet.next()).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(false); 
    Mockito.when(resultSet.getString("cityName")).thenReturn("Philadelphia").thenReturn("Boston").thenReturn("New York"); 

    Statement statement = Mockito.mock(Statement.class); 
    Mockito.when(statement.executeQuery(Mockito.anyString())).thenReturn(resultSet); 

    Mockito.when(mockConnection.createStatement()).thenReturn(statement); 

    citiesServlet.doGet(testRequest, testResponse); 
} 

}

回答