Reputation: 31
I'm new to JUnit test and I tried to create my first JUnit test using a sample JUnit test. But, I keep getting the above exception. Below is my JUnit test code.
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!");
}
}
The error occurs at the line indicated above, and I don't understand why I'm getting null pointer exception because servletUnderTest
has already been initialized. Any help is much appreciated!
EDIT: Below is the stack trace of the error:
[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
Below is my StudentTimelineJobsServlet class code:
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);
}
}
Upvotes: 0
Views: 1382
Reputation: 6414
In your doGet method you have:
@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);
}
What do you think the mock objects HttpServletRequest req, HttpServletResponse resp
will return when you call getSomething()
on them without setting what these mocks should return in such case? They will return null
, this is the cause of the NPE, you need to record proper behavior at least for these calls listed in the snippet above.
Upvotes: 1