You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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`.
14
14
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
+
15
52
## Tworzenie
16
53
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.
17
54
@@ -223,17 +260,22 @@ class AnswerTest {
223
260
{% endhighlight %}
224
261
225
262
## 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`.
227
264
228
265
{% highlight kotlin %}
229
-
@RunWith(MockitoJUnitRunner::class)
230
266
class VerifyTest {
231
267
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
+
232
277
@Test
233
278
fun checkHowManyTimesGetInfoCalled() {
234
-
val mock = mock(Data::class.java)
235
-
val manager = Manager(mock)
236
-
237
279
verifyZeroInteractions(mock) //any methods called on the mock
238
280
verify(mock, never()).getInfo()
239
281
@@ -244,6 +286,17 @@ class VerifyTest {
244
286
verify(mock, atMost(3)).getInfo()
245
287
verifyNoMoreInteractions(mock) //no others method called
0 commit comments