@@ -24,9 +24,8 @@ import org.apache.pekko.http.scaladsl.server.{RequestContext, RouteResult}
2424import org .apache .pekko .stream .scaladsl .Keep
2525import org .apache .pekko .stream .testkit .scaladsl .{TestSink , TestSource }
2626import org .apache .pekko .testkit .TestKit
27- import org .mockito .ArgumentCaptor
28- import org .mockito .ArgumentMatchers .any
29- import org .mockito .Mockito .{mock , when }
27+ import org .scalamock .matchers .ArgCapture .CaptureOne
28+ import org .scalamock .scalatest .MockFactory
3029import org .scalatest .BeforeAndAfterAll
3130import org .scalatest .concurrent .ScalaFutures
3231import org .scalatest .flatspec .AnyFlatSpecLike
@@ -38,23 +37,22 @@ class HttpMetricsSpec
3837 extends TestKit (ActorSystem (" HttpMetricsSpec" ))
3938 with AnyFlatSpecLike
4039 with Matchers
40+ with MockFactory
4141 with ScalaFutures
4242 with BeforeAndAfterAll {
4343
4444 implicit val ec : ExecutionContext = system.dispatcher
4545
46- private def anyRequestContext () = any(classOf [RequestContext ])
47- private def anyRequest () = any(classOf [HttpRequest ])
48-
4946 abstract class Fixture [T ] {
50- val metricsHandler : HttpMetricsHandler =
51- mock(classOf [HttpMetricsHandler ])
52- val server : Function [RequestContext , Future [RouteResult ]] =
53- mock(classOf [Function [RequestContext , Future [RouteResult ]]])
47+ val handler = mock[HttpMetricsHandler ]
48+ val server = mockFunction[RequestContext , Future [RouteResult ]]
49+
50+ (handler.onConnection _).expects().returns((): Unit )
51+ (handler.onDisconnection _).expects().returns((): Unit )
5452
5553 val (source, sink) = TestSource
5654 .probe[HttpRequest ]
57- .via(HttpMetrics .meterFlow(metricsHandler ).join(HttpMetrics .metricsRouteToFlow(server)))
55+ .via(HttpMetrics .meterFlow(handler ).join(HttpMetrics .metricsRouteToFlow(server)))
5856 .toMat(TestSink .probe[HttpResponse ])(Keep .both)
5957 .run()
6058
@@ -97,80 +95,99 @@ class HttpMetricsSpec
9795 }
9896
9997 it should " call the metrics handler on handled requests" in new Fixture {
100- val request : ArgumentCaptor [HttpRequest ] = ArgumentCaptor .forClass(classOf [HttpRequest ])
101- val response : ArgumentCaptor [HttpResponse ] = ArgumentCaptor .forClass(classOf [HttpResponse ])
102- when(metricsHandler.onRequest(request.capture()))
103- .thenAnswer(_.getArgument(0 ))
98+ val request = CaptureOne [HttpRequest ]()
99+ val response = CaptureOne [HttpResponse ]()
100+
101+ (handler.onRequest _)
102+ .expects(capture(request))
103+ .onCall { (req : HttpRequest ) => req }
104104
105- when(server.apply(anyRequestContext()))
106- .thenAnswer(invocation => complete(StatusCodes .OK )(invocation.getArgument[RequestContext ](0 )))
107- when(metricsHandler.onResponse(anyRequest(), response.capture()))
108- .thenAnswer(_.getArgument(1 ))
105+ server
106+ .expects(* )
107+ .onCall(complete(StatusCodes .OK ))
109108
109+ (handler.onResponse _)
110+ .expects(* , capture(response))
111+ .onCall { (_ : HttpRequest , resp : HttpResponse ) => resp }
112+
113+ val expectedRequest = HttpRequest ()
110114 sink.request(1 )
111- source.sendNext(HttpRequest () )
115+ source.sendNext(expectedRequest )
112116 sink.expectNext()
113117
114118 source.sendComplete()
115119 sink.expectComplete()
116120
117- val expected = Marshal (StatusCodes .OK )
121+ val expectedResponse = Marshal (StatusCodes .OK )
118122 .to[HttpResponse ]
119123 .futureValue
120124
121- response.getValue shouldBe expected
125+ request.value shouldBe expectedRequest
126+ response.value shouldBe expectedResponse
122127 }
123128
124129 it should " call the metrics handler on rejected requests" in new Fixture {
125- val request : ArgumentCaptor [HttpRequest ] = ArgumentCaptor .forClass(classOf [HttpRequest ])
126- val response : ArgumentCaptor [HttpResponse ] = ArgumentCaptor .forClass(classOf [HttpResponse ])
127- when(metricsHandler.onRequest(request.capture()))
128- .thenAnswer(_.getArgument(0 ))
130+ val request = CaptureOne [HttpRequest ]()
131+ val response = CaptureOne [HttpResponse ]()
132+ (handler.onRequest _)
133+ .expects(capture(request))
134+ .onCall { (req : HttpRequest ) => req }
129135
130- when(server.apply(anyRequestContext()))
131- .thenAnswer(invocation => reject(invocation.getArgument[RequestContext ](0 )))
136+ server
137+ .expects(* )
138+ .onCall(reject)
132139
133- when(metricsHandler.onResponse(anyRequest(), response.capture()))
134- .thenAnswer(_.getArgument(1 ))
140+ (handler.onResponse _)
141+ .expects(* , capture(response))
142+ .onCall { (_ : HttpRequest , resp : HttpResponse ) => resp }
135143
144+ val expectedRequest = HttpRequest ()
136145 sink.request(1 )
137- source.sendNext(HttpRequest () )
146+ source.sendNext(expectedRequest )
138147 sink.expectNext()
139148
140149 source.sendComplete()
141150 sink.expectComplete()
142151
143- val expected = Marshal (StatusCodes .NotFound -> " The requested resource could not be found." )
152+ val expectedResponse = Marshal (StatusCodes .NotFound -> " The requested resource could not be found." )
144153 .to[HttpResponse ]
145154 .futureValue
146155 .addAttribute(PathLabeler .key, " unhandled" )
147- response.getValue shouldBe expected
156+
157+ request.value shouldBe expectedRequest
158+ response.value shouldBe expectedResponse
148159 }
149160
150161 it should " call the metrics handler on error requests" in new Fixture {
151- val request : ArgumentCaptor [HttpRequest ] = ArgumentCaptor .forClass(classOf [HttpRequest ])
152- val response : ArgumentCaptor [HttpResponse ] = ArgumentCaptor .forClass(classOf [HttpResponse ])
153- when(metricsHandler.onRequest(request.capture()))
154- .thenAnswer(_.getArgument(0 ))
162+ val request = CaptureOne [HttpRequest ]()
163+ val response = CaptureOne [HttpResponse ]()
164+ (handler.onRequest _)
165+ .expects(capture(request))
166+ .onCall { (req : HttpRequest ) => req }
155167
156- when(server.apply(anyRequestContext()))
157- .thenAnswer(invocation => failWith(new Exception (" BOOM!" ))(invocation.getArgument[RequestContext ](0 )))
168+ server
169+ .expects(* )
170+ .onCall(failWith(new Exception (" BOOM!" )))
158171
159- when(metricsHandler.onResponse(anyRequest(), response.capture()))
160- .thenAnswer(_.getArgument(1 ))
172+ (handler.onResponse _)
173+ .expects(* , capture(response))
174+ .onCall { (_ : HttpRequest , resp : HttpResponse ) => resp }
161175
176+ val expectedRequest = HttpRequest ()
162177 sink.request(1 )
163- source.sendNext(HttpRequest () )
178+ source.sendNext(expectedRequest )
164179 sink.expectNext()
165180
166181 source.sendComplete()
167182 sink.expectComplete()
168183
169- val expected = Marshal (StatusCodes .InternalServerError )
184+ val expectedResponse = Marshal (StatusCodes .InternalServerError )
170185 .to[HttpResponse ]
171186 .futureValue
172187 .addAttribute(PathLabeler .key, " unhandled" )
173- response.getValue shouldBe expected
188+
189+ request.value shouldBe expectedRequest
190+ response.value shouldBe expectedResponse
174191 }
175192
176193}
0 commit comments