我是JUnit测试的新手,我尝试使用示例JUnit测试创建我的第一个JUnit测试。但是,我不断收到上述异常。下面是我的JUnit测试代码。
package iworks;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Unit tests for {@link StudentTimelineJobsServlet}.
*/
@RunWith(JUnit4.class)
public class StudentTimelineJobsServletTest {
private static final String FAKE_URL = "fake.fk/hello";
// Set up a helper so that the ApiProxy returns a valid environment for local testing.
private final LocalServiceTestHelper helper = new LocalServiceTestHelper();
@Mock private HttpServletRequest mockRequest;
@Mock private HttpServletResponse mockResponse;
private StringWriter responseWriter;
private StudentTimelineJobsServlet servletUnderTest;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
helper.setUp();
// Set up some fake HTTP requests
when(mockRequest.getRequestURI()).thenReturn(FAKE_URL);
// Set up a fake HTTP response.
responseWriter = new StringWriter();
when(mockResponse.getWriter()).thenReturn(new PrintWriter(responseWriter));
servletUnderTest = new StudentTimelineJobsServlet();
}
@After public void tearDown() {
helper.tearDown();
}
@Test
public void doGetWritesResponse() throws Exception {
servletUnderTest.doGet(mockRequest, mockResponse);// The error occurs at this line
// assertThat(responseWriter.toString())
// .named("StudentTimelineJobsServlet response")
// .contains("Jobs fetched successfully!");
}
}
错误发生在上面指出的行,并且我不明白为什么我会得到空指针异常,因为servletUnderTest
已被初始化。任何帮助深表感谢!
编辑:以下是错误的堆栈跟踪:
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.334 s <<< FAILURE! - in iworks.StudentTimelineJobsServletTest
[ERROR] doGetWritesResponse(iworks.StudentTimelineJobsServletTest) Time elapsed: 0.329 s <<< ERROR!
java.lang.NullPointerException
at iworks.StudentTimelineJobsServletTest.doGetWritesResponse(StudentTimelineJobsServletTest.java:60)
[INFO]
[INFO] Results:
[INFO]
[ERROR] Errors:
[ERROR] StudentTimelineJobsServletTest.doGetWritesResponse:60 » NullPointer
[INFO]
[ERROR] Tests run: 3, Failures: 0, Errors: 1, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 23.845 s
[INFO] Finished at: 2019-11-09T18:40:51-05:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.20:test (default-test) on project iworks: There are test failures.
[ERROR]
[ERROR] Please refer to C:\Users\Semeredin\IdeaProjects\SWE_Project\iWorks\target\surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date]-jvmRun[N].dump, [date].dumpstream and [date]-jvmRun[N].dumpstream.
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.20:test (default-test) on project iworks: There are test failures.
Please refer to C:\Users\Semeredin\IdeaProjects\SWE_Project\iWorks\target\surefire-reports for the individual test results.
Please refer to dump files (if any exist) [date]-jvmRun[N].dump, [date].dumpstream and [date]-jvmRun[N].dumpstream.
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:215)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
at org.apache.maven.lifecycle.internal.MojoExecutor.executeForkedExecutions (MojoExecutor.java:355)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:200)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: org.apache.maven.plugin.MojoFailureException: There are test failures.
Please refer to C:\Users\Semeredin\IdeaProjects\SWE_Project\iWorks\target\surefire-reports for the individual test results.
Please refer to dump files (if any exist) [date]-jvmRun[N].dump, [date].dumpstream and [date]-jvmRun[N].dumpstream.
at org.apache.maven.plugin.surefire.SurefireHelper.throwException (SurefireHelper.java:204)
at org.apache.maven.plugin.surefire.SurefireHelper.reportExecution (SurefireHelper.java:98)
at org.apache.maven.plugin.surefire.SurefirePlugin.handleSummary (SurefirePlugin.java:334)
at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked (AbstractSurefireMojo.java:937)
at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute (AbstractSurefireMojo.java:785)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
at org.apache.maven.lifecycle.internal.MojoExecutor.executeForkedExecutions (MojoExecutor.java:355)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:200)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
[ERROR]
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
下面是我的StudentTimelineJobsServlet类代码:
package iworks;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
@WebServlet(name = "StudentTimelineJobsServlet", value = "/jobs")
public class StudentTimelineJobsServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException {
// Extract the pool from the Servlet Context, reusing the one that was created
// in the ContextListener when the application was started
DataSource pool = (DataSource) req.getServletContext().getAttribute("my-pool");
List<OpportunityPost> jobs = new ArrayList<>();
try (Connection conn = pool.getConnection()) {
// PreparedStatements are compiled by the database immediately and executed at a later date.
// Most databases cache previously compiled queries, which improves efficiency.
PreparedStatement jobsStmt = conn.prepareStatement(
"SELECT title, institution, period, location, description, link FROM jobs");
// Execute the statement
ResultSet jobsResults = jobsStmt.executeQuery();
// Convert a ResultSet into OpportunityPost objects
while (jobsResults.next()) {
String title = jobsResults.getString(1);
String institution = jobsResults.getString(2);
String period = jobsResults.getString(3);
String location = jobsResults.getString(4);
String description = jobsResults.getString(5);
String link = jobsResults.getString(6);
jobs.add(new OpportunityPost(title, institution, period, location, description, link));
}
} catch (SQLException ex) {
// If something goes wrong, the application needs to react appropriately. This might mean
// getting a new connection and executing the query again, or it might mean redirecting the
// user to a different page to let them know something went wrong.
throw new ServletException("Unable to successfully connect to the database. Please try again.", ex);
}
// Add variables and render the page
req.setAttribute("jobs", jobs);
resp.setContentType("text/plain");
resp.getWriter().println("Jobs fetched successfully!");
req.getRequestDispatcher("/studentTimelineJobs.jsp").forward(req, resp);
}
}
答案 0 :(得分:1)
在doGet方法中,您具有:
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) {
//....
DataSource pool = (DataSource) req.getServletContext().getAttribute("my-pool");
//....
resp.getWriter().println("Jobs fetched successfully!");
req.getRequestDispatcher("/studentTimelineJobs.jsp").forward(req, resp);
}
您对模拟对象HttpServletRequest req, HttpServletResponse resp
调用getSomething()
而不设置在这种情况下应返回的模拟对象,您会怎么看?他们将返回null
,这是NPE的原因,您至少需要为上面摘录中列出的这些呼叫记录正确的行为。