Unit testing org.powermock.reflect.exceptions.MethodNotFoundException:-模拟java sql类时

Unit testing org.powermock.reflect.exceptions.MethodNotFoundException:-模拟java sql类时,unit-testing,junit,mockito,powermockito,Unit Testing,Junit,Mockito,Powermockito,我正在尝试为包含对Postgres数据库的调用的servlet编写单元测试。我在模拟连接,语句和结果集类。但是,对这些调用的mock的任何方法调用都会给我一个MethodNotFoundException。在一些参考文献中,它提到一些功能在Java8和PowerMock 1.5.x中被破坏,但我使用的是PowerMock 1.6.6。非常感谢您的帮助 代码如下: 公共类CitiesServlet扩展了HttpServlet{ private static final Logger log = L

我正在尝试为包含对Postgres数据库的调用的servlet编写单元测试。我在模拟
连接
语句
结果集
类。但是,对这些调用的mock的任何方法调用都会给我一个
MethodNotFoundException
。在一些参考文献中,它提到一些功能在Java8和PowerMock 1.5.x中被破坏,但我使用的是PowerMock 1.6.6。非常感谢您的帮助

代码如下: 公共类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;
}}

}

为登陆此网站的任何人更新。我发现这是PowerMock 1.6.6的一个回归错误,PowerMock()的github repo中有一个目标修复版本为1.6.7的错误(#177)。回到1.6.5,我解决了这个问题。

对于登陆此网站的人更新。我发现这是PowerMock 1.6.6的一个回归错误,PowerMock()的github repo中有一个目标修复版本为1.6.7的错误(#177)。回到1.6.5,我解决了这个问题

@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);
}