Skip to content

Commit c549686

Browse files
committed
shadows added to robolectric
1 parent 975b1a3 commit c549686

File tree

1 file changed

+58
-14
lines changed

1 file changed

+58
-14
lines changed

_drafts/2019-01-28-robolectric.md

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -139,19 +139,6 @@ class ConfigurationTest {
139139
{% highlight kotlin %}
140140
@RunWith(RobolectricTestRunner::class)
141141
class LifecycleTest {
142-
143-
@Test
144-
fun checkMainActivityHasWorkingFinishLifecycle() {
145-
//this activity goes throw all create lifecycle
146-
val controller = Robolectric.buildActivity(MainActivity::class.java)
147-
val activity = controller.create().start().resume().visible().get()
148-
//equivalent of val activity = Robolectric.setupActivity(MainActivity::class.java)
149-
//visible methods assures that activity view's is attached
150-
151-
assertFalse(activity.isFinishing)
152-
activity.finish()
153-
assertTrue(activity.isFinishing)
154-
}
155142

156143
@Test
157144
fun checkMainActivityHasWorkingLifecycle() {
@@ -173,6 +160,19 @@ class LifecycleTest {
173160
assertEquals(Lifecycle.State.DESTROYED, activity.lifecycle.currentState)
174161
}
175162

163+
@Test
164+
fun checkMainActivityHasWorkingFinishLifecycle() {
165+
//this activity goes throw all create lifecycle
166+
val controller = Robolectric.buildActivity(MainActivity::class.java)
167+
val activity = controller.create().start().resume().visible().get()
168+
//equivalent of val activity = Robolectric.setupActivity(MainActivity::class.java)
169+
//visible methods assures that activity view's is attached
170+
171+
assertFalse(activity.isFinishing)
172+
activity.finish()
173+
assertTrue(activity.isFinishing)
174+
}
175+
176176
@Test
177177
fun checkMainActivityHasWorkingRestoringState() {
178178
val savedInstanceState = Bundle()
@@ -220,4 +220,48 @@ class SomeService : Service() {
220220
{% endhighlight %}
221221

222222
## Shadow
223-
//TODO
223+
Robolectric tworzy środowisko wykonawcze zawierające prawdziwy kod Android SDK co zwiększa realizm testów tak jakby były przeprowadzane na fizycznym urządzeniu. Wszystkie klasy Android są zastąpione tzw. `obiektami cienia` (`Shadows`). Każdy obiekt cienia może modyfikować lub rozszerzać zachowanie odpowiadającej mu klasy z Android SDK. Aby stworzyć klasę `Shadow` należy oznaczyć ją adnotacją `@Implements` wraz z nazwą odpowiadającej klasy Android, opcjonalnie rozszerzyć superklasę Shadow oraz dostarczyć publiczny bez argumentowy konstruktor. Metody rozszerzene muszą mieć adnotację `@Implementation` (obiekt cienia implementuje metody z tą samą sygnaturą dla odpowiadającej klasy Android niezależnie od modyfikatora dostępu) i przeważnie modyfikator `protected`. Metoda `directlyOn` pozwala na wywołanie akcji na faktycznym obiekcie.
224+
225+
{% highlight kotlin %}
226+
@Implements(TextView::class)
227+
class CustomTextShadowView : ShadowView() {
228+
229+
@Implementation
230+
fun setEnabled(enable: Boolean) {
231+
directlyOn(realView, View::class.java).setEnabled(enable)
232+
if(enable)
233+
directlyOn(realView, View::class.java).setAlpha(1.0f)
234+
else
235+
directlyOn(realView, View::class.java).setAlpha(0.5f)
236+
}
237+
238+
fun getAlpha() : Float {
239+
return realView.alpha
240+
}
241+
}
242+
{% endhighlight %}
243+
244+
Klasa testowa lub metoda wykorzystująca własną implementacje klas Shadows musi być oznaczona adnotacją `@Config(shadows=arrayOf(CustomShadowClass::class))` (lub zawierać odpowiedni wpis w pliku ustawień) co umożliwia rozpoznanie i skojarzenie klas Shadow z klasami przykrywanymi. Metoda `shadowOf` jest przeznaczona dla dostarczonych przez Robolectric klas Shadow, natomiast `extract` dla autorskich klas Shadow.
245+
246+
{% highlight kotlin %}
247+
@RunWith(RobolectricTestRunner::class)
248+
@Config(shadows=arrayOf(CustomShadowTextView::class))
249+
class ShadowTest {
250+
251+
@Test
252+
fun shadowCustomClassImplicit() {
253+
val activity = Robolectric.setupActivity(MainActivity::class.java)
254+
val view = activity.textViewTitle //TextView instance
255+
view.setEnabled(false)
256+
assertEquals(0.5f, view.getAlpha())
257+
}
258+
259+
@Test
260+
fun shadowCustomClassExplicit() {
261+
val activity = Robolectric.setupActivity(MainActivity::class.java)
262+
val view = extract(activity.textViewTitle) as CustomShadowTextView
263+
view.setEnabled(false)
264+
assertEquals(0.5f, view.getAlpha())
265+
}
266+
}
267+
{% endhighlight %}

0 commit comments

Comments
 (0)