2017-02-02 1 views
1

Je rencontre des problèmes lors de la tentative de configuration d'une infrastructure de test dans Spring Boot 1.5.1.RELEASE et Wiremock 2.5.1. Il est lancer:ClassNotFoundException avec Wiremock 2.5.1 et Spring Boot 1.5.1

java.lang.NoClassDefFoundError: org/apache/http/client/HttpClient 
    at com.github.tomakehurst.wiremock.core.WireMockApp.buildStubRequestHandler(WireMockApp.java:124) 
    at com.github.tomakehurst.wiremock.WireMockServer.<init>(WireMockServer.java:71) 
    at com.github.tomakehurst.wiremock.junit.WireMockRule.<init>(WireMockRule.java:42) 
    at com.github.tomakehurst.wiremock.junit.WireMockRule.<init>(WireMockRule.java:38) 
    at br.com.mobicare.minhaoi.WiremockTest.<clinit>(WiremockTest.java:21) 
    at sun.misc.Unsafe.ensureClassInitialized(Native Method) 
    at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:43) 
    at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:142) 
    at java.lang.reflect.Field.acquireFieldAccessor(Field.java:1088) 
    at java.lang.reflect.Field.getFieldAccessor(Field.java:1069) 
    at java.lang.reflect.Field.get(Field.java:393) 
    at org.junit.runners.model.FrameworkField.get(FrameworkField.java:73) 
    at org.junit.runners.model.TestClass.getAnnotatedFieldValues(TestClass.java:230) 
    at org.junit.runners.ParentRunner.classRules(ParentRunner.java:255) 
    at org.junit.runners.ParentRunner.withClassRules(ParentRunner.java:244) 
    at org.junit.runners.ParentRunner.classBlock(ParentRunner.java:194) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:362) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:253) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84) 
    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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.HttpClient 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 28 more 

passe utilisé Wiremock 2.4.1 et Spring Boot 1.3.0.M5 dans un autre projet et n'a jamais eu ce problème.

Ma classe de test:

@RunWith(SpringRunner.class) 
@SpringBootTest 
@WebAppConfiguration 
public class WiremockTest { 

    @ClassRule 
    public static WireMockRule wireMockRule = new WireMockRule(options().port(8888).notifier(new ConsoleNotifier(true))); 

    @Test 
    public void testStub() { 
     wireMockRule.stubFor(get(urlEqualTo("/test")) 
       .willReturn(aResponse() 
         .withHeader("Content-type", "application/json").withStatus(200))); 
    } 

} 

J'ai remarqué que certaines annotations de test ont changé depuis la version 1.3.0.M5 du printemps Boot et je pense que cela pourrait être le problème. Est-ce que quelqu'un a eu le même problème?

Merci,

+0

Avez-vous essayé d'utiliser l'artefact wiremock-standalone comme décrit dans les docs? – Tom

+0

Il, Tom, merci pour votre réponse. Je n'ai pas essayé avec le jar du standalone dans le classpath, mais en démarrant le standalone en dehors de l'application cela a fonctionné. J'ai trouvé la solution et je posterai la réponse. – Pimenta

Répondre

1

J'ai trouvé la solution.

Pour une raison quelconque, les dépendances de la jetée n'ont pas été importées par Maven, donc j'ai dû les déclarer. Ils sont:

<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-continuation</artifactId> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-http</artifactId> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-io</artifactId> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-security</artifactId> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-server</artifactId> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-servlet</artifactId> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-servlets</artifactId> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-util</artifactId> 
    <scope>test</scope> 
</dependency> 

Si Java 1.8 est utilisé, il est autorisé à omettre la version pour les dépendances et la jetée utiliser Wiremock 2.5.1. Mais si c'est Java 1.7, comme le mien, je conseille d'utiliser Wiremock 2.4.1 et sa version de dépendances de Jetty qui est 9.2.13.v20150730.

Je ne sais pas si c'est la meilleure solution, mais a travaillé comme un charme pour moi. J'espère que cela t'aides!

2

En utilisant spring-boot-dependencies:1.5.2 et je spring-cloud-dependencies:Dalston.RC1 dû ajouter ce qui suit pour obtenir Wiremock au travail:

... 
<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-dependencies</artifactId> 
      <version>Dalston.RC1</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-dependencies</artifactId> 
      <version>1.5.2</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
</dependencyManagement> 

<dependencies> 
    ... 

    <dependency> 
     <groupId>com.github.tomakehurst</groupId> 
     <artifactId>wiremock</artifactId> 
     <version>2.5.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpclient</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-server</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-servlet</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-servlets</artifactId> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 

En cas où quelqu'un d'autre frappe cette question ...

EDIT: Sinon, une dépendance beaucoup plus concise à utiliser serait:

<dependencies> 
    ... 
    <dependency> 
     <groupId>com.github.tomakehurst</groupId> 
     <artifactId>wiremock-standalone</artifactId> 
     <version>2.6.0</version> 
     <scope>test</scope> 
    </dependency> 
    <!-- Don't need all the jetty and httpclient deps. --> 
</dependencies> 
... 
1

de l'wiremock documentation:

Actuellement, il est recommandé d'utiliser le JAR autonome en tant que dépendance avec les projets Spring Boot. Cela évite un conflit sur la version Jetta .