简体   繁体   中英

Junit test with Mockito, GridFS, REST controller

在此输入图像描述 I am writing junit tests for a file upload/download rest service. Running into NPE's with calling "gridFSBucket.find(eq(objectId)).first(); I know from previous posts that Bson does not implement eq. So, I've been using Document instead. I've also tried using Mockito's do return method instead, but that didn't seem to work. Thanks for your support.

"doReturn(gridFSFindIterable).when(gridFSBucket).find(doc);"

FileRest setup params

private MockMvc mockMvc;

  private Logger logger = LoggerFactory.getLogger(GridfsApplicationTests.class);

  @Spy
  GridFSBucket gridFSBucket;

  @Mock
  MongoConfig mongoConfig;

  @InjectMocks
  private FileUploadRestController fileUploadRestController;

  private GridFS gridFS;
  private GridFSFile gridFSFile;
  private GridFSDownloadStream gridFSDownloadStream;
  private MongoClient mongoClient;
  private GridFSFindIterable gridFSFindIterable;

  @Before
  public void Setup() {
    try {
      MockitoAnnotations.initMocks(this);
      mockMvc = MockMvcBuilders.standaloneSetup(fileUploadRestController).build();
      assertNotNull(mockMvc);
      fileLicense = new File(String.valueOf(path.toFile()));
      gridFS = mock(GridFS.class);
      mongoConfig = mock(MongoConfig.class);
      gridFSDownloadStream = mock(GridFSDownloadStream.class);
      mongoClient = mock(MongoClient.class);
      gridFSFile = mock(GridFSFile.class);
      gridFSFindIterable = mock(GridFSFindIterable.class);
    } catch (NullPointerException npe) {
      logger.warn("Unable to read file: {}", path, npe);
    }
    assertThat(fileLicense).exists();
  }

FindRestController endpoint

  @GetMapping("/find/")
  public ResponseEntity<?> findFile(@RequestParam("id") String id) {
    ObjectId objectId = new ObjectId(id);
    JSONObject jsonObject = new JSONObject();
    GridFSFile file = gridFSBucket.find(eq(objectId)).first();
    if (file != null) {
      HttpHeaders httpHeaders = new HttpHeaders();
      httpHeaders.setContentType(MediaType.APPLICATION_JSON);
      jsonObject.put("file", file.getId().toString());
      return new ResponseEntity<>(jsonObject.toString(), httpHeaders, HttpStatus.OK);
    }
    return new ResponseEntity<>(HttpStatus.NOT_FOUND);
  }

Junit test case of find:

  @Test
  public void testFindFile_givenObjectId_ReturnSuccessful() throws IOException {
    // given
    String id = "5c87b948ff03f91885cedb25";
    Document doc = new Document("test.txt", fileLicense);
    doc.append("id", id);

    Mockito.when(gridFSBucket.find(any(Bson.class))).thenReturn(gridFSFindIterable);
    Mockito.when(gridFSFindIterable.first()).thenReturn(gridFSFile);
    // when
    try {
      MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
        .get("/fileupload/find/?id=5c87b948ff03f91885cedb25")
        .contentType(MediaType.APPLICATION_JSON)
        .accept("*");
      MvcResult result = mockMvc.perform(requestBuilder).andDo(print()).andReturn();
      MockHttpServletResponse response = result.getResponse();
      // then
      Assert.assertEquals("response status is wrong", 200, response.getStatus());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

NPE error:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1013)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:71)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:166)
    at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:133)
    at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:182)
    at com.parsons.gridfs.GridfsApplicationTests.testFindFile_givenObjectId_ReturnSuccessful(GridfsApplicationTests.java:233)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:79)
    at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:85)
    at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
    at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.lang.NullPointerException
    at com.parsons.gridfs.FileUploadRestController.findFile(FileUploadRestController.java:120)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    ... 36 more

Marking as resolved. I returned the file object in my response instead of GridFSFile's object.getId().toString();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM