2015-03-05 3 views
1

Я довольно новичок в спрее. Я пытаюсь получить тестирование правильно, поэтому я использовал пример, показанный в spary testkit, однако я получаю эти ошибки. любая помощь будет принята с благодарностью :

The service should 

Could not initialize class spray.http.Uri$ 
java.lang.NoClassDefFoundError: Could not initialize class spray.http.Uri$ 
    at spray.httpx.RequestBuilding$RequestBuilder.apply(RequestBuilding.scala:36) 
    at spray.httpx.RequestBuilding$RequestBuilder.apply(RequestBuilding.scala:34) 
    at com.tr.route.EventRouteTester$$anonfun$3$$anonfun$apply$2.apply(EventRouteTester.scala:38) 
    at com.tr.route.EventRouteTester$$anonfun$3$$anonfun$apply$2.apply(EventRouteTester.scala:38) 

return a 'PONG!' response for GET requests to /ping 

Could not initialize class spray.http.Uri$ 
java.lang.NoClassDefFoundError: Could not initialize class spray.http.Uri$ 
    at spray.httpx.RequestBuilding$RequestBuilder.apply(RequestBuilding.scala:36) 
    at spray.httpx.RequestBuilding$RequestBuilder.apply(RequestBuilding.scala:34) 
    at com.tr.route.EventRouteTester$$anonfun$3$$anonfun$apply$6.apply(EventRouteTester.scala:44) 
    at com.tr.route.EventRouteTester$$anonfun$3$$anonfun$apply$6.apply(EventRouteTester.scala:44) 

leave GET requests to other paths unhandled 

scala/collection/GenTraversableOnce$class 
java.lang.NoClassDefFoundError: scala/collection/GenTraversableOnce$class 
    at spray.http.Uri$Query.<init>(Uri.scala:496) 
    at spray.http.Uri$Query$Empty$.<init>(Uri.scala:575) 
    at spray.http.Uri$Query$Empty$.<clinit>(Uri.scala) 
    at spray.http.parser.UriParser.<init>(UriParser.scala:37) 
    at spray.http.Uri$.apply(Uri.scala:231) 
    at spray.http.Uri$.apply(Uri.scala:203) 
    at spray.http.Uri$.<init>(Uri.scala:194) 
    at spray.http.Uri$.<clinit>(Uri.scala) 
    at spray.httpx.RequestBuilding$RequestBuilder.apply(RequestBuilding.scala:36) 
    at spray.httpx.RequestBuilding$RequestBuilder.apply(RequestBuilding.scala:34) 
    at spray.httpx.RequestBuilding$RequestBuilder.apply(RequestBuilding.scala:33) 
    at com.tr.route.EventRouteTester$$anonfun$3$$anonfun$apply$9.apply(EventRouteTester.scala:50) 
    at com.tr.route.EventRouteTester$$anonfun$3$$anonfun$apply$9.apply(EventRouteTester.scala:50) 
Caused by: java.lang.ClassNotFoundException: scala.collection.GenTraversableOnce$class 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    ... 13 more 

return a MethodNotAllowed error for PUT requests to the root path 

это тестовый класс

class RouteTester extends Specification with Specs2RouteTest with HttpService { 
    def actorRefFactory = system // connect the DSL to the test ActorSystem 

    val smallRoute = 
    get { 
     pathSingleSlash { 
     complete { 
      <html> 
      <body> 
       <h1>Say hello to <i>spray</i>!</h1> 
      </body> 
      </html> 
     } 
     } ~ 
     path("ping") { 
      complete("PONG!") 
     } 
    } 

    "The service" should { 

    "return a greeting for GET requests to the root path" in { 
     Get() ~> smallRoute ~> check { 
     responseAs[String] must contain("Say hello") 
     } 
    } 

    "return a 'PONG!' response for GET requests to /ping" in { 
     Get("/ping") ~> smallRoute ~> check { 
     responseAs[String] === "PONG!" 
     } 
    } 

    "leave GET requests to other paths unhandled" in { 
     Get("/kermit") ~> smallRoute ~> check { 
     handled must beFalse 
     } 
    } 

    "return a MethodNotAllowed error for PUT requests to the root path" in { 
     Put() ~> sealRoute(smallRoute) ~> check { 
     status === MethodNotAllowed 
     responseAs[String] === "HTTP method not allowed, supported methods: GET" 
     } 
    } 
    } 
} 

Я использую Maven этого являются зависимостями и версии

<scala.version>2.11.2</scala.version> 
     <spray.version>1.3.1</spray.version> 
     <akka.version>2.3.8</akka.version> 

     <dependency> 
      <groupId>io.spray</groupId> 
      <artifactId>spray-can</artifactId> 
      <version>${spray.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>io.spray</groupId> 
      <artifactId>spray-routing</artifactId> 
      <version>${spray.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>io.spray</groupId> 
      <artifactId>spray-json_2.11</artifactId> 
      <version>${spray.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>io.spray</groupId> 
      <artifactId>spray-testkit_2.11</artifactId> 
      <version>${spray.version}</version> 
     </dependency> 
+0

Кажется, что код был запущен, хотя его нельзя было скомпилировать. Что такое вывод 'mvn compile'? – mirelon

+0

@mirelon mvn clean compile results - build success – igx

+0

Я понятия не имею, почему классы не найдены, но я недавно прошел через это и закончил использование чистого akka-testkit, проверив передачу сообщения HttpServiceActor (отправил HttpRequest и ожидаемый HttpResponse). Если вам интересно, я могу поделиться некоторым кодом ... – mirelon

ответ

1

Недавно я был слишком борющиеся с различными тест-китами и закончил использование чистого Akka TestKit, потому что Spray TestKit заставлял меня разделить мой HttpSer ViceActors в отдельные черты и актеры, что было неприемлемо для меня.

я могу поделиться код для вдохновения, вы можете дать ему попробовать (если кто-то пришел с лучшим ответом):

RestInterface.scala:

import spray.routing.HttpServiceActor 

class RestInterface extends HttpServiceActor { 
    override def receive: Receive = runRoute(smallRoute) 
    val smallRoute = 
    get { 
     pathSingleSlash { 
     complete { 
      <html> 
      <body> 
       <h1>Say hello to <i>spray</i>!</h1> 
      </body> 
      </html> 
     } 
     } ~ 
     path("ping") { 
     complete("PONG!") 
     } 
    } 
} 

RestInterfaceSpec.scala:

import akka.actor.{Props, ActorSystem} 
import akka.testkit.{TestActorRef, ImplicitSender, TestKit} 
import org.scalatest.{BeforeAndAfterAll, Matchers, WordSpecLike} 
import spray.http.HttpResponse 
import spray.httpx.RequestBuilding 

class RestInterfaceSpec(_system: ActorSystem) extends TestKit(_system) with ImplicitSender with WordSpecLike with Matchers with BeforeAndAfterAll with RequestBuilding with SpecHelper { 
    def this() = this(ActorSystem("MySpec")) 

    "The service" must { 
    "return a response" in { 
     val service = TestActorRef[RestInterface] 
     service ! Get("/") 
     expectMsgType[HttpResponse] 
    } 
    } 
} 

SpecHelper.scala:

import akka.actor.ActorSystem 
import akka.testkit.TestKit 

trait SpecHelper extends BeforeAndAfterAll { this: Suite => 
    implicit val system: ActorSystem 

    override def afterAll(): Unit = { 
    TestKit.shutdownActorSystem(system) 
    } 
} 
+0

Ну, не повезло и там. запуск вашего кода и получение этой ошибки: нужный класс не найден. Это может быть связано с ошибкой в ​​вашей траектории пути. Отсутствует класс: Scala/выполнения/AbstractPartialFunction $ mcVL $ зр java.lang.NoClassDefFoundError: Scala/выполнения/AbstractPartialFunction $ mcVL $ зр \t на java.lang.ClassLoader.defineClass1 (Native Method) ... – igx

+0

Вполне возможно, что это будет чистая проблема с maven, посмотрите http://stackoverflow.com/questions/16420935/-required-class-was-missing-while-executing-org-apache-maven-pluginsmaven-sure, http://stackoverflow.com/questions/18442753/a-required-class-was-missing-while-executing-org-apache-maven-pluginsmaven-war, http: // stackoverflow.com/questions/20689773/casbah-scala-runtime-error – mirelon

+0

Это не похоже на maven, но может быть – igx

1

решена! Проблема заключалась в том, что зависимости требуют разные версии. т. е. артефакты спрей-распылители и распыления могут зависеть от scala 2.10, тогда как остальные заявленные зависимости зависят от scala 2.11.

все, что я должен был сделать, это изменить зависимости на:

<scalaBinaryVersion>2.11</scalaBinaryVersion> 
<dependency> 
    <groupId>io.spray</groupId> 
    <artifactId>spray-can_${scalaBinaryVersion}</artifactId> 

    <version>${spray.version}</version> 
</dependency> 
<dependency> 
    <groupId>io.spray</groupId> 
    <artifactId>spray-routing_${scalaBinaryVersion}</artifactId> 

    <version>${spray.version}</version> 
</dependency> 

и проблема решена!

+0

О да, я упустил это. Я использую SBT вместо Maven, и он скрывает это в двухпроцентном символе: http://stackoverflow.com/questions/17461453/build-scala-and-symbols-meaning – mirelon

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