Skip to content

Commit e176a80

Browse files
authored
Fix verify macro to support mocks created inside fixture classes (#214)
* Fix verify macro to support mocks created inside fixture classes
1 parent ec8770b commit e176a80

File tree

2 files changed

+63
-13
lines changed

2 files changed

+63
-13
lines changed

macro/src/main/scala/org/mockito/VerifyMacro.scala

+16-13
Original file line numberDiff line numberDiff line change
@@ -90,31 +90,34 @@ private[mockito] trait VerificationMacroTransformer {
9090
} else throw new Exception(s"Couldn't recognize invocation ${show(invocation)}")
9191
}
9292

93+
protected def transformMockWasNeverCalled[T: c.WeakTypeTag, R](c: blackbox.Context)(obj: c.Tree, called: c.Tree): c.Tree = {
94+
import c.universe._
95+
called match {
96+
case q"$_.called" => q"verification(_root_.org.mockito.MockitoSugar.verifyZeroInteractions($obj))"
97+
case q"$_.calledAgain" => q"verification(_root_.org.mockito.MockitoSugar.verifyNoMoreInteractions($obj))"
98+
case q"$_.calledAgain.apply($_.ignoringStubs)" =>
99+
q"verification(_root_.org.mockito.MockitoSugar.verifyNoMoreInteractions(_root_.org.mockito.MockitoSugar.ignoreStubs($obj): _*))"
100+
}
101+
}
102+
93103
protected def transformVerification[T: c.WeakTypeTag, R](c: blackbox.Context)(called: c.Tree): c.Tree = {
94104
import c.universe._
95105

96106
called match {
97107
case q"$_.VerifyingOps[$_]($invocation).was($_.called)($order)" =>
98108
transformInvocation(c)(invocation, order, q"_root_.org.mockito.VerifyMacro.Once")
99109

100-
case q"$_.VerifyingOps[$_]($_.this.$obj).wasNever($called)($_)" =>
101-
called match {
102-
case q"$_.called" => q"verification(_root_.org.mockito.MockitoSugar.verifyZeroInteractions($obj))"
103-
case q"$_.calledAgain" => q"verification(_root_.org.mockito.MockitoSugar.verifyNoMoreInteractions($obj))"
104-
case q"$_.calledAgain.apply($_.ignoringStubs)" =>
105-
q"verification(_root_.org.mockito.MockitoSugar.verifyNoMoreInteractions(_root_.org.mockito.MockitoSugar.ignoreStubs($obj): _*))"
106-
}
110+
case q"$_.VerifyingOps[$_]($a.$b).wasNever($called)($order)" =>
111+
q"""
112+
if (_root_.org.mockito.MockitoSugar.mockingDetails($a).isMock) ${transformInvocation(c)(q"$a.$b", order, q"_root_.org.mockito.VerifyMacro.Never")}
113+
else ${transformMockWasNeverCalled(c)(q"$a.$b", called)}
114+
"""
107115

108116
case q"$_.VerifyingOps[$_]($obj.$method[..$targs](...$args)).wasNever($_.called)($order)" =>
109117
transformInvocation(c)(q"$obj.$method[..$targs](...$args)", order, q"_root_.org.mockito.VerifyMacro.Never")
110118

111119
case q"$_.VerifyingOps[$_]($obj).wasNever($called)($_)" =>
112-
called match {
113-
case q"$_.called" => q"verification(_root_.org.mockito.MockitoSugar.verifyZeroInteractions($obj))"
114-
case q"$_.calledAgain" => q"verification(_root_.org.mockito.MockitoSugar.verifyNoMoreInteractions($obj))"
115-
case q"$_.calledAgain.apply($_.ignoringStubs)" =>
116-
q"verification(_root_.org.mockito.MockitoSugar.verifyNoMoreInteractions(_root_.org.mockito.MockitoSugar.ignoreStubs($obj): _*))"
117-
}
120+
transformMockWasNeverCalled(c)(obj, called)
118121

119122
case q"$_.VerifyingOps[$_]($invocation).wasCalled($times)($order)" =>
120123
transformInvocation(c)(invocation, order, times)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package user.org.mockito.scalatest
2+
3+
import org.mockito.exceptions.verification.{ NeverWantedButInvoked, NoInteractionsWanted }
4+
import org.mockito.scalatest.IdiomaticMockito
5+
import org.scalatest.matchers.should.Matchers
6+
import org.scalatest.{ fixture, Outcome }
7+
8+
class IdiomaticMockitoFixtureClassTest extends fixture.FlatSpec with IdiomaticMockito with Matchers {
9+
class Foo {
10+
def bar(a: String) = "bar"
11+
def baz = "baz"
12+
}
13+
14+
class FixtureParam {
15+
val foo: Foo = mock[Foo]
16+
}
17+
18+
def withFixture(test: OneArgTest): Outcome = {
19+
val theFixture = new FixtureParam
20+
withFixture(test.toNoArgTest(theFixture))
21+
}
22+
23+
"Mockito" should "verifyNoMoreInteractions fixture objects" in { f: FixtureParam =>
24+
"mocked" willBe returned by f.foo.bar("pepe")
25+
26+
f.foo wasNever called
27+
28+
f.foo.bar("pepe") shouldBe "mocked"
29+
30+
a[NoInteractionsWanted] should be thrownBy {
31+
f.foo wasNever called
32+
}
33+
}
34+
35+
"Mockito" should "verify no calls on fixture objects methods" in { f: FixtureParam =>
36+
"mocked" willBe returned by f.foo.bar("pepe")
37+
"mocked" willBe returned by f.foo.baz
38+
39+
f.foo.bar("pepe") shouldBe "mocked"
40+
f.foo.baz shouldBe "mocked"
41+
42+
a[NeverWantedButInvoked] should be thrownBy {
43+
f.foo.bar(*) wasNever called
44+
f.foo.baz wasNever called
45+
}
46+
}
47+
}

0 commit comments

Comments
 (0)