找不到类型为 ^ 的证据参数的隐式值
could not find implicit value for evidence parameter of type ^
我正在尝试为 Post 请求编写测试
这是我的代码:
val request = CreateLinkRequest(token = Some(validToken),billing_ref_id = Some("123"), store_id = Some("123"), agent_id = Some("123"))
val endPoint = Uri(this.serverRootUrl + "path").toString
val post = Post(endPoint, request)
val pipeline = jsonAsStringPipeline(post)
val responseContents = Await.ready(pipeline, atMost = callMaxWaitDuration)
但这无法编译,我不断收到此错误:
Error:(156, 20) could not find implicit value for evidence parameter of type spray.httpx.marshalling.Marshaller[CreateLinkSpec.this.CreateLinkRequest]
val post = Post(endPoint, request)
^
Error:(156, 20) not enough arguments for method apply: (implicit evidence:
spray.httpx.marshalling.Marshaller[CreateLinkSpec.this.CreateLinkRequest])spray.http.HttpRequest in class RequestBuilder.
Unspecified value parameter evidence.
val post = Post(endPoint, request)
^
这是什么意思?
我该如何解决?
编辑:
这是正文中的 json :
{ token:"123", billing_ref_id:"123", store_id:"123", agent_id:"123"}
这是代码中的对象:
private final case class CreateLinkRequest(
token: Option[String] = Some(validToken),
billing_ref_id: Option[String] = Some(Random.alphanumeric.take(10).mkString),
agent_id: Option[String] = Some(Random.alphanumeric.take(3).mkString),
store_id: Option[String] = Some(Random.alphanumeric.take(3).mkString)
)
您正在尝试调用以 implicit Marshaller
作为参数的 Post
方法。请注意,只要编译器可以在范围内找到一个隐式参数,就不必提供隐式参数(检查此以获取有关隐式的更多信息:Where does Scala look for implicits?)
但是,您的代码没有定义任何隐式编组器,因此编译器不知道如何将您的 case class
转换为 HttpEntity
。
在您的情况下,您希望将其转换为 HttpEntity
和 Content-Type: application/json
。为此,您只需定义:implicit val CreateLinkRequestMarshaller: Marshaller[CreateLinkRequest]
。这告诉 scala 如何将你的 case class
转换成 HttpEntity
.
您还希望将其作为 JSON 传递给上下文,因此我们将定义我们的 JsonProtocol,即 MyJsonProtocol
.
package test
import spray.http.HttpEntity
import spray.http._
import spray.json._
import spray.httpx.marshalling.{Marshaller, MarshallingContext}
import test.TestMarshaller.CreateLinkRequest
object MyJsonProtocol extends DefaultJsonProtocol {
implicit def createLinkRequestFormat: JsonFormat[CreateLinkRequest] = jsonFormat4(CreateLinkRequest)
}
object TestMarshaller extends App {
import MyJsonProtocol._
case class CreateLinkRequest(token: Option[String], billing_ref_id: Option[String], store_id: Option[String], agent_id: Option[String])
implicit val CreateLinkRequestMarshaller: Marshaller[CreateLinkRequest] = new Marshaller[CreateLinkRequest] {
override def apply(value: CreateLinkRequest, ctx: MarshallingContext): Unit = {
val entity = HttpEntity(MediaTypes.`application/json`, value.toJson.compactPrint)
ctx.marshalTo(entity)
}
}
// Here goes your test
}
请注意,您可以在其他地方定义这些隐式,例如a package
然后在测试 class 中导入它。这样会更好,因为您肯定想重用 Marshaller。
我正在尝试为 Post 请求编写测试
这是我的代码:
val request = CreateLinkRequest(token = Some(validToken),billing_ref_id = Some("123"), store_id = Some("123"), agent_id = Some("123"))
val endPoint = Uri(this.serverRootUrl + "path").toString
val post = Post(endPoint, request)
val pipeline = jsonAsStringPipeline(post)
val responseContents = Await.ready(pipeline, atMost = callMaxWaitDuration)
但这无法编译,我不断收到此错误:
Error:(156, 20) could not find implicit value for evidence parameter of type spray.httpx.marshalling.Marshaller[CreateLinkSpec.this.CreateLinkRequest]
val post = Post(endPoint, request)
^
Error:(156, 20) not enough arguments for method apply: (implicit evidence:
spray.httpx.marshalling.Marshaller[CreateLinkSpec.this.CreateLinkRequest])spray.http.HttpRequest in class RequestBuilder.
Unspecified value parameter evidence.
val post = Post(endPoint, request)
^
这是什么意思?
我该如何解决?
编辑: 这是正文中的 json :
{ token:"123", billing_ref_id:"123", store_id:"123", agent_id:"123"}
这是代码中的对象:
private final case class CreateLinkRequest(
token: Option[String] = Some(validToken),
billing_ref_id: Option[String] = Some(Random.alphanumeric.take(10).mkString),
agent_id: Option[String] = Some(Random.alphanumeric.take(3).mkString),
store_id: Option[String] = Some(Random.alphanumeric.take(3).mkString)
)
您正在尝试调用以 implicit Marshaller
作为参数的 Post
方法。请注意,只要编译器可以在范围内找到一个隐式参数,就不必提供隐式参数(检查此以获取有关隐式的更多信息:Where does Scala look for implicits?)
但是,您的代码没有定义任何隐式编组器,因此编译器不知道如何将您的 case class
转换为 HttpEntity
。
在您的情况下,您希望将其转换为 HttpEntity
和 Content-Type: application/json
。为此,您只需定义:implicit val CreateLinkRequestMarshaller: Marshaller[CreateLinkRequest]
。这告诉 scala 如何将你的 case class
转换成 HttpEntity
.
您还希望将其作为 JSON 传递给上下文,因此我们将定义我们的 JsonProtocol,即 MyJsonProtocol
.
package test
import spray.http.HttpEntity
import spray.http._
import spray.json._
import spray.httpx.marshalling.{Marshaller, MarshallingContext}
import test.TestMarshaller.CreateLinkRequest
object MyJsonProtocol extends DefaultJsonProtocol {
implicit def createLinkRequestFormat: JsonFormat[CreateLinkRequest] = jsonFormat4(CreateLinkRequest)
}
object TestMarshaller extends App {
import MyJsonProtocol._
case class CreateLinkRequest(token: Option[String], billing_ref_id: Option[String], store_id: Option[String], agent_id: Option[String])
implicit val CreateLinkRequestMarshaller: Marshaller[CreateLinkRequest] = new Marshaller[CreateLinkRequest] {
override def apply(value: CreateLinkRequest, ctx: MarshallingContext): Unit = {
val entity = HttpEntity(MediaTypes.`application/json`, value.toJson.compactPrint)
ctx.marshalTo(entity)
}
}
// Here goes your test
}
请注意,您可以在其他地方定义这些隐式,例如a package
然后在测试 class 中导入它。这样会更好,因为您肯定想重用 Marshaller。