2016-10-06 4 views
2

Я проверяю мою конечную точку, построенный с dropwizard, но что-то идет не так:Dropwizard FileNotFoundException в то время как файл присутствует и рассматривается отладчик

@Test 
public void testPostWithFileSuccess() throws Exception 
{ 
    FileDataBodyPart filePart = new FileDataBodyPart("file", new File(fixture("resources/testImage.jpg"))); 
    filePart.setContentDisposition(FormDataContentDisposition.name("file").fileName("testImage.jpg").build()); 

    FormDataMultiPart request = new FormDataMultiPart(); 
    request.field("data", fixture("resources/postWithFileSuccess.json"), MediaType.APPLICATION_JSON_TYPE); 
    request.bodyPart(filePart); 

    WebTarget target = mClient.target("http://localhost:8080/crackers").register(MultiPartFeature.class); 
    Response response = target 
      .request() 
      .post(Entity.entity(request, MediaType.MULTIPART_FORM_DATA)); 

    assertThat(response.getStatus()).isEqualTo(200); 
} 

Что происходит на самом деле тест не на .post(Entity.entity(request, MediaType.MULTIPART_FORM_DATA)); со следующим expection:

javax.ws.rs.ProcessingException: java.io.FileNotFoundException: Неверный путь к файлу в org.glassfish.jersey.client.internal.HttpUrlConnector.apply (HttpUrlConnector.java:287) в org.glassfish. Джерси. client.ClientRuntime.invoke (ClientRuntime.java:252) at org.glassfish.jersey.client.JerseyInvocation $ 1.call (JerseyInvocation.java:684) at org.glassfish.jersey.client.JerseyInvocation $ 1.call (JerseyInvocation. java: 681) at org.glassfish.jersey.internal.Errors.process (Errors.java:315) at org.glassfish.jersey.internal.Errors.process (Errors.java:297) at org.glassfish. jersey.internal.Errors.process (Errors.java:228) at org.glassfish.jersey.process.internal.RequestScope.runInScope (RequestScope.java:444) at org.glassfish.jersey.client.JerseyInvocation.invoke (JerseyInvocation.java:681) at org.glassfish.jersey.client.JerseyInvocation $ Builder.method (JerseyInvocation.java:437) at org.glassfish.jersey.client.J erseyInvocation $ Builder.post (JerseyInvocation.java:343) в org.example.project.resources.CrackersTest.testPostWithFileSuccess (CrackersTest.java:201) на sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) в sun.reflect .NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) на sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) на java.lang.reflect.Method.invoke (Method.java:498) в org.junit .runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:47) на org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) на org.junit.runners.model.FrameworkMethod. invokeExplosively (FrameworkMethod.java:44) at org.j unit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:17) на org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:26) на org.junit.internal.runners. statement.RunAfters.evaluate (RunAfters.java:27) на org.junit.rules.ExternalResource $ 1.evaluate (ExternalResource.java:48) на org.junit.rules.RunRules.evaluate (RunRules.java:20) на org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:271) в org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:70) в org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java : 50) at org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:238) at org.junit.runners.ParentRunner $ 1.sche dule (ParentRunner.java:63) на org.junit.runners.ParentRunner.runChildren (ParentRunner.java:236) на org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:53) на org.junit .runners.ParentRunner $ 2.оценить (ParentRunner.java:229) на org.junit.runners.ParentRunner.run (ParentRunner.java:309) на org.junit.runner.JUnitCore.run (JUnitCore.java:160) на com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs (JUnit4IdeaTestRunner.java:117) в com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs (JUnit4IdeaTestRunner.java:42) в com.intellij.rt.execution.junit.JUnitStarter. prepareStreamsAndStart (JUnitStarter.java:262) at com.intellij.rt.execution.junit.JUnitStarter.main (JUnitStarter.Java: 84) на sun.reflect.NativeMethodAccessorImpl.invoke0 (нативный метод) на sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) на sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) at com.intellij.rt.execution.application.AppMain.main (AppMain.java:147) Вызвано: java.io.FileNotFoundException: Недействительно путь к файлу в java.io.FileInputStream. (FileInputStream.java:133) at org.glassfish.jersey.message.internal.FileProvider.writeTo (FileProvider.java:115) at org.glassfish.jersey.message.internal .FileProvider.writeTo (FileProvider.java:67) at org.glassfish.jerse y.media.multipart.internal.MultiPartWriter.writeTo (MultiPartWriter.java:232) на org.glassfish.jersey.media.multipart.internal.MultiPartWriter.writeTo (MultiPartWriter.java:79) на org.glassfish.jersey. message.internal.WriterInterceptorExecutor $ TerminalWriterInterceptor.invokeWriteTo (WriterInterceptorExecutor.java:265) в org.glassfish.jersey.message.internal.WriterInterceptorExecutor $ TerminalWriterInterceptor.aroundWriteTo (WriterInterceptorExecutor.java:250) в org.glassfish.jersey.message. internal.WriterInterceptorExecutor.proceed (WriterInterceptorExecutor.java:162) at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo (MessageBodyFactory.java:1130) at org.glassfish.jersey.client.ClientRequest.doWriteEntity (ClientRequest. java: 517) at org.glassfish .jersey.client.ClientRequest.writeEntity (ClientRequest.java:499) at org.glassfish.jersey.client.internal.HttpUrlConnector._apply (HttpUrlConnector.java:388) at org.glassfish.jersey.client.internal.HttpUrlConnector .Не (HttpUrlConnector.java:285) ... подробнее 42

Я не совсем уверен, как будто файл не присутствовал или путь был бы неправильно, Exception был бы выброшен на new File(...) декларация.

Существует, очевидно, что-то не так с filePart, но что? Если я прокомментирую request.bodyPart(filePart);, тест просто завершится ошибкой сравнения (это ожидается).

+0

Не могли бы вы добавить свой метод арматуре? У меня есть тестовый интегральный тест для этого, но я использую поток. Из вашего файла, похоже, вы также должны использовать поток? – pandaadb

+0

@pandaadb Ваш комментарий просто привел меня прямо к ответу. Thanx! –

+0

Это здорово. Возможно, вы можете ответить на свои вопросы, чтобы другие могли учиться. Также мне интересно узнать, что было не так :) – pandaadb

ответ

0

Проблема заключается в том, что метод fixture(...) возвращает Resources.toString(Resources.getResource(filename), charset).trim(), поэтому отладчик видит файл, но post(...) не может его обработать.

Чтобы устранить эту проблему, вместо

new File(fixture("resources/testImage.jpg")) 

я должен использовать

new File(Resources.getResource("resources/testImage.jpg").toURI()) 

Полный фиксированный метод листинга:

@Test 
public void testPostWithFileSuccess() throws Exception 
{ 
    FileDataBodyPart filePart = new FileDataBodyPart("file", new File(Resources.getResource("resources/testImage.jpg").toURI())); 
    filePart.setContentDisposition(FormDataContentDisposition.name("file").fileName("testImage.jpg").build()); 

    FormDataMultiPart request = new FormDataMultiPart(); 
    request.field("data", fixture("resources/postWithFileSuccess.json"), MediaType.APPLICATION_JSON_TYPE); 
    request.bodyPart(filePart); 

    WebTarget target = mClient.target("http://localhost:8080/crackers").register(MultiPartFeature.class); 
    Response response = target 
      .request() 
      .post(Entity.entity(request, MediaType.MULTIPART_FORM_DATA)); 

    assertThat(response.getStatus()).isEqualTo(200); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^