Skip to content

Commit 7c6ecbc

Browse files
authored
argumentcaptor and source classes added into mockito post
1 parent 59ad72e commit 7c6ecbc

File tree

1 file changed

+58
-5
lines changed

1 file changed

+58
-5
lines changed

_drafts/2019-01-21-mockito.md

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,43 @@ keywords: "testowanie, testing, testy, jednostkowe, automatyczne, lokalne, instr
1212
## Dublerzy
1313
Testy jednostkowe rzadko kiedy dotyczą jednostki testowej wolnej od zależności innych obiektów co w konsekwencji prowadzi do definicji problemu tworzenia niezależnych testów na których rezultat nie ma wpływu żadna zależność testowanej jednostki. Wymaganą prawdziwą zależność można czasami dostarczyć ręcznie jednakże jest to kosztowne, obarczone marginesem błędu oraz często niewykonalne (szczególnie w przypadku testów instrumentalnych). Alternatywą dla tworzenia prawdziwych zależności jest dostarczanie `dublerów` (`double test`), które można sklasyfikować ze względu na przeznaczenie. Jedna z wielu definicji wyróżnia m.in. następujące obiekty: `dummy`, `fake`, `stub` i `mock`. `Dummy` jest przekazywany w celu spełnienia założeń sygnatury jednak jego metody nie są wywoływane. `Fake` posiada uproszczoną działającą implementacje spełniającą założenia interakcji. `Stub` dostarcza minimalną implementacją zależności, która pomija proces obliczeniowy i bezpośrednio zwraca zdefiniowany rezultat w taki sposób, aby test wykonał się pozytywnie. Natomiast `mock` to naiwna implementacja zależności, która bierze udział w procesie testowania i rejestruje nawiązane z nią interakcje, przeznaczona do badania zachowania. Mnogość definicji podziału dublerów oraz wynikające z tego różnice są powodem wielu niejasności, a sama terminologia jest mało istotna w procesie tworzenia zastępników. Pozwala on jednak zrozumieć co dokładnie i w jaki sposób ma zostać przetestowane. `Mockito` jest frameworkiem wspomagającym pisanie testów jednostkowych poprzez dostarczanie dublerów, które dzieli na zwyczajne `Mock` oraz częściowe `Spy`.
1414

15+
>**Przykład**
16+
>Na podstawie poniższych klas Manager oraz Data zostaną przedstawione cechy i właściwości zarządzania naiwnymi implementacjami w Mockito.
17+
18+
{% highlight kotlin %}
19+
class Manager(val data: Data) {
20+
21+
fun fetchData(): String {
22+
return data.getInfo()
23+
}
24+
25+
fun fetchDataWithMessage(message: String): String {
26+
return data.getInfo(message)
27+
}
28+
}
29+
30+
data class Data(var number: Int, var text: String) {
31+
32+
constructor() : this(0, "")
33+
34+
fun getInfo(): String {
35+
return "$text $number"
36+
}
37+
38+
fun getInfo(message: String?): String {
39+
return "$message $number"
40+
}
41+
42+
fun publicMethod(): String {
43+
return privateMethod()
44+
}
45+
46+
private fun privateMethod(): String {
47+
return "private returned from public"
48+
}
49+
}
50+
{% endhighlight %}
51+
1552
## Tworzenie
1653
Obiekt zastępnika oznaczony adnotacją `@Mock` lub `@Spy` może zostać inicjalizowany na kilka sposobów, m.in. poprzez uruchomienie klasy z użyciem `@RunWith(MockitoJUnitRunner.class)`, wykorzystanie zasady `MockitoJUnit.rule()` lub manualną inicjalizację za pomocą metody `MockitoAnnotations.initMocks()`. Instancję atrapy można uzyskać statyczną metodą `mock()` lub `spy()` co pozwala na pominięcie adnotacji.
1754

@@ -223,17 +260,22 @@ class AnswerTest {
223260
{% endhighlight %}
224261

225262
## 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()`.
263+
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()`. Aby uzyskać informacje nt argumentów wywołań funkcji należy wykorzystać `ArgumentCaptor`.
227264

228265
{% highlight kotlin %}
229-
@RunWith(MockitoJUnitRunner::class)
230266
class VerifyTest {
231267

268+
lateinit var mock: Data
269+
lateinit var manager: Manager
270+
271+
@Before
272+
fun init() {
273+
mock = mock(Data::class.java)
274+
manager = Manager(mock)
275+
}
276+
232277
@Test
233278
fun checkHowManyTimesGetInfoCalled() {
234-
val mock = mock(Data::class.java)
235-
val manager = Manager(mock)
236-
237279
verifyZeroInteractions(mock) //any methods called on the mock
238280
verify(mock, never()).getInfo()
239281

@@ -244,6 +286,17 @@ class VerifyTest {
244286
verify(mock, atMost(3)).getInfo()
245287
verifyNoMoreInteractions(mock) //no others method called
246288
}
289+
290+
291+
@Test
292+
fun checkArgsOfGetInfo() {
293+
val captor = forClass(String::class.java)
294+
manager.fetchDataWithMessage("message")
295+
296+
//verify args passed into getInfo method
297+
verify(mock).getInfo(captor.capture())
298+
assertEquals("message", captor.value)
299+
}
247300
}
248301
{% endhighlight %}
249302

0 commit comments

Comments
 (0)