2013-05-12 32 views
12

Tôi đang có một chút thời gian khó khăn khi cố gắng hiểu cách viết các bài kiểm tra trong Scala khi các tham số ngầm được tham gia.Scala thử nghiệm mocking tham số ngầm định?

tôi có như sau (phiên bản ngắn) của mã và thử nghiệm của tôi:

thực hiện (Scala 2.10, Phun và Akka):

import spray.httpx.SprayJsonSupport._ 
import com.acme.ResultJsonFormat._ 

case class PerRequestIndexingActor(ctx: RequestContext) extends Actor with ActorLogging { 
    def receive = LoggingReceive { 
    case AddToIndexRequestCompleted(result) => 
     ctx.complete(result) 
     context.stop(self) 
    } 
} 


object ResultJsonFormat extends DefaultJsonProtocol { 
    implicit val resultFormat = jsonFormat2(Result) 
} 

case class Result(code: Int, message: String) 

Test (Sử dụng ScalaTest và Mockito):

"Per Request Indexing Actor" should { 
    "send the HTTP Response when AddToIndexRequestCompleted message is received" in { 
     val request = mock[RequestContext] 
     val result = mock[Result] 

     val perRequestIndexingActor = TestActorRef(Props(new PerRequestIndexingActor(request))) 
     perRequestIndexingActor ! AddToIndexRequestCompleted(result) 

     verify(request).complete(result) 
    } 
    } 

Dòng này, verify(request).complete(result) sử dụng trình ẩn ngữ Marshaller để biến Result thành JSON.

Tôi có thể đưa một trình soạn thảo vào phạm vi bằng cách thêm implicit val marshaller: Marshaller[Result] = mock[Marshaller[Result]] nhưng khi tôi chạy thử nghiệm, một ví dụ khác của Marshaller được sử dụng, do đó xác minh không thành công.

Thậm chí chuyển rõ ràng mô hình Marshaller đến complete không thành công.

Vì vậy, bất kỳ ai có thể tư vấn cách tạo đối tượng giả cho một tham số ngầm định và đảm bảo rằng trường hợp đó là thông số được sử dụng?

+0

Làm cách nào để chuyển mô hình không thành công? Tại sao bạn muốn sử dụng một marshaller giả ở nơi đầu tiên? (Tôi đã không sử dụng mockito vì vậy xin vui lòng tha cho tôi nếu đó là những câu hỏi ngu ngốc) – jrudolph

Trả lời

5

Đây là tình huống hoàn hảo để sử dụng Matcher từ Mockito cho người lập bản đồ. Bạn không cần phải thử marshaller ngầm. Tất cả những gì bạn thực sự muốn làm là xác minh rằng complete được gọi với một số result phù hợp với những gì bạn mong đợi và cũng có thể là một số ví dụ của trình so khớp. Thứ nhất, nếu bạn chưa thực hiện nó, mang Mockito quẹt vào phạm vi bằng cách nhập như vậy:

import org.mockito.Matchers._ 

Sau đó, nếu bạn muốn phù hợp với tài liệu tham khảo về kết quả, bạn có thể xác minh như vậy:

verify(request).complete(same(result))(any[classOf[Marshaller[Result]]]) 

Hoặc, nếu bạn muốn bằng khớp trên kết quả mà bạn có thể làm:

verify(request).complete(eq(result))(any(classOf[Marshaller[Result]])) 

Bí quyết với quẹt là một khi bạn sử dụng một cho một arg, bạn phải sử dụng chúng cho tất cả args, vì vậy đó là lý do tại sao chúng tôi có t o sử dụng một cho result.

+0

Tôi đã cố gắng đó quá. Mặc dù tôi đã không thử sử dụng matcher 'same()'. Tôi không chắc tại sao (chưa) bài kiểm tra chuyển khi sử dụng 'verify (request) .complete (cùng (kết quả)) (bất kỳ [classOf [Marshaller [Result]]])' nhưng không vượt qua khi sử dụng 'verify (request) .complete (eq (kết quả)) (bất kỳ (classOf [Marshaller [Result]])) '. Cảm ơn đề nghị của bạn mặc dù, nó đã giúp :) – C0deAttack

+0

Bởi vì biến yêu cầu chính nó là một giả, và trình so khớp eq sử dụng phương thức equals mà không được stubbed, bạn luôn luôn nhận được sai, do đó không phù hợp. Tương tự là một sự phù hợp tốt ở đây. Nếu yêu cầu không phải là một mô hình và thay vào đó một số trường hợp lớp, eq có thể phù hợp hơn – cmbaxter

+1

Cảm ơn bạn đã theo dõi. Xin lỗi vì không rõ ràng. Sử dụng 'eq' thử nghiệm thậm chí không biên dịch. Khi tôi sử dụng 'eq' thông báo lỗi là" Loại không khớp, được mong đợi: Marshaller [Boolean], thực tế: Marshaller [Result] ". Và đó là một lỗi trên 'bất kỳ (classOf [Marshaller [Result]])'. Tôi không rõ 100% lý do tại sao lỗi xảy ra? Nó khá kỳ quặc. – C0deAttack

Các vấn đề liên quan