Skip to content

Commit 7143da6

Browse files
authored
Update 2019-01-21-mockito.md
1 parent e832831 commit 7143da6

File tree

1 file changed

+70
-13
lines changed

1 file changed

+70
-13
lines changed

_drafts/2019-01-21-mockito.md

Lines changed: 70 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ categories: ["Testowanie"]
66
image: testing/mockito
77
github: testing/tree/master/mockito
88
description: "Mockito"
9-
keywords: "testowanie, testing, testy, jednostkowe, automatyczne, lokalne, instrumentalne, zaślepka, atrapa, unit test, mock, stub, junit, robolectric, mockito, android, programowanie, programming"
9+
keywords: "testowanie, testing, testy, jednostkowe, automatyczne, lokalne, instrumentalne, dubler, zaślepka, atrapa, unit test, mock, spy, stub, junit, verify, when, thenreturn, answer, robolectric, mockito, android, programowanie, programming"
1010
---
1111

1212
## Dublerzy
@@ -18,7 +18,7 @@ Obiekt zastępnika oznaczony adnotacją `@Mock` lub `@Spy` może zostać inicjal
1818
{% highlight kotlin %}
1919
//use Mockito runner
2020
@RunWith(MockitoJUnitRunner::class)
21-
class InitMockTest {
21+
class InitMockRunnerTest {
2222

2323
@Mock
2424
var obj: Data? = null
@@ -30,7 +30,7 @@ class InitMockTest {
3030
}
3131

3232
//or use Mockito rule
33-
class InitMockTest {
33+
class InitMockRuleTest {
3434

3535
@Mock
3636
var obj: Data? = null
@@ -45,7 +45,7 @@ class InitMockTest {
4545
}
4646

4747
//or use manual init method
48-
class InitMockTest {
48+
class InitMockAnnotationTest {
4949

5050
@Mock
5151
var obj: Data? = null
@@ -58,7 +58,7 @@ class InitMockTest {
5858
}
5959

6060
//or use static mock method
61-
class InitMockTest {
61+
class InitMockMethodTest {
6262

6363
@Test
6464
fun checkIsObjectInitialized() {
@@ -98,7 +98,7 @@ class InjectMockTest {
9898
{% endhighlight %}
9999

100100
## Mock i Spy
101-
Mockito wprowadza podział zastępników na zwyczajne (`Mock`) oraz częściowe (`Spy`). `Mock` imituje wykonanie metod klasy bez wpływu na instancję atrapy. `Spy` wywołuje realną implementację instancji klasy dla wszystkich zachowań dla których nie została zdefiniowana naiwna implementacja zachowując przy tym właściwości atrapy (weryfikacja i imitacja).
101+
Mockito wprowadza podział zastępników na zwyczajne (`Mock`) oraz częściowe (`Spy`). `Mock` nie tworzy faktycznej instancji lecz obiekt klasy szkieletowej co pozwala w całości na imitacje wykonania metod klasy bez wpływu na strukturę atrapy. `Spy` tworzy realną instancje klasy przez co wywołuje faktyczną implementację obiektu dla wszystkich zachowań dla których nie została zdefiniowana naiwna implementacja zachowując przy tym właściwości atrapy (weryfikacja i imitacja).
102102

103103
{% highlight kotlin %}
104104
@RunWith(MockitoJUnitRunner::class)
@@ -132,9 +132,16 @@ class ConfigurationTest {
132132
@Mock
133133
lateinit var mock: Data
134134

135-
@InjectMocks
135+
@Spy
136+
lateinit var spy: Data
137+
136138
lateinit var manager: Manager
137139

140+
@Before
141+
fun init() {
142+
manager = Manager(mock)
143+
}
144+
138145
@Test
139146
fun checkFetchDataReturnsMockValue() {
140147
assertNull(manager.fetchData())
@@ -155,18 +162,19 @@ class ConfigurationTest {
155162

156163
@Test
157164
fun checkFetchDataTakesMultipleArgReturnsMockValue() {
158-
assertNull(manager.fetchData())
159-
doReturn("spy with arg").`when`(mock).getInfo("arg1")
160-
doReturn("spy with arg").`when`(mock).getInfo("arg2")
165+
manager = Manager(spy)
166+
doReturn("spy with arg").`when`(spy).getInfo("arg1")
167+
doReturn("spy with arg").`when`(spy).getInfo("arg2")
161168
assertEquals("spy with arg", manager.fetchDataWithMessage("arg1"))
162169
assertEquals("spy with arg", manager.fetchDataWithMessage("arg2"))
163170
//not possible without reset using when.thenReturn
164171
}
165172

166173
@Test
167174
fun checkGetInfoForWrappedReturnsWrapperValue() {
168-
var data = Data()
169-
var spyData = spy(data)
175+
val data = Data()
176+
val spyData = Mockito.spy(data)
177+
manager = Manager(spyData)
170178
doReturn("wrapper").`when`(spyData).getInfo()
171179
assertEquals("wrapper", manager.fetchData())
172180
}
@@ -188,4 +196,53 @@ class ConfigurationTest {
188196
}
189197
{% endhighlight %}
190198

191-
## Weryfikacja
199+
Dla bardziej złożonych zapytań dla których oczekiwany rezultat nie jest jawny lub zależnych od argumentów można wykorzystać instrukcję `thenAnswer` lub `doAnswer`.
200+
201+
{% highlight kotlin %}
202+
@RunWith(MockitoJUnitRunner::class)
203+
class AnswerTest {
204+
205+
@Test
206+
fun checkFetchDataWithObjectChangedAndReturnsItsValue() {
207+
val spy = spy(Data::class.java)
208+
val manager = Manager(mock)
209+
210+
assertEquals(" 0", manager.fetchData())
211+
assertEquals("message 0", manager.fetchDataWithMessage("message"))
212+
213+
doAnswer(Answer {
214+
spy.number++
215+
spy.text = it.arguments[0] as String
216+
return@Answer spy.getInfo()
217+
}).`when`(spy).getInfo(anyString())
218+
219+
assertEquals("message 1", manager.fetchDataWithMessage("message"))
220+
assertEquals("message 1", manager.fetchData())
221+
}
222+
}
223+
{% endhighlight %}
224+
225+
## Weryfikacja
226+
Mockito przechowuje informacje na temat wszystkich wywołań metod wraz z użytymi argumentami. Dzięki temu pozwala na śledzenie działalności atrap oraz weryfikację ich wywołań za pomocą funkcji `verify()`.
227+
228+
{% highlight kotlin %}
229+
@RunWith(MockitoJUnitRunner::class)
230+
class VerifyTest {
231+
232+
@Test
233+
fun checkHowManyTimesGetInfoCalled() {
234+
val mock = mock(Data::class.java)
235+
val manager = Manager(mock)
236+
237+
verifyZeroInteractions(mock) //any methods called on the mock
238+
verify(mock, never()).getInfo()
239+
240+
manager.fetchData()
241+
242+
verify(mock, times(1)).getInfo()
243+
verify(mock, atLeast(1)).getInfo()
244+
verify(mock, atMost(3)).getInfo()
245+
verifyNoMoreInteractions(mock) //no others method called
246+
}
247+
}
248+
{% endhighlight %}

0 commit comments

Comments
 (0)