11package com .d4rk .androidtutorials .java .ads .managers ;
22
33import static org .junit .Assert .assertFalse ;
4+ import static org .junit .Assert .assertNotNull ;
5+ import static org .junit .Assert .assertNull ;
46import static org .junit .Assert .assertTrue ;
57import static org .mockito .ArgumentMatchers .any ;
68import static org .mockito .ArgumentMatchers .anyString ;
1618
1719import com .d4rk .androidtutorials .java .ads .AdUtils ;
1820import com .d4rk .androidtutorials .java .ads .managers .AppOpenAd .OnShowAdCompleteListener ;
21+ import com .google .android .gms .ads .AdError ;
1922import com .google .android .gms .ads .AdRequest ;
2023import com .google .android .gms .ads .FullScreenContentCallback ;
24+ import com .google .android .gms .ads .LoadAdError ;
2125import com .google .android .gms .ads .appopen .AppOpenAd .AppOpenAdLoadCallback ;
2226
2327import org .junit .Before ;
@@ -131,6 +135,101 @@ public void showAdIfAvailable_withAd_doesNotShowTwiceWhileShowing() throws Excep
131135 verify (ad , times (1 )).show (activity );
132136 }
133137
138+ @ Test
139+ public void showAdIfAvailable_withAd_handlesDismissAndReloads () throws Exception {
140+ Activity activity = mock (Activity .class );
141+ OnShowAdCompleteListener listener = mock (OnShowAdCompleteListener .class );
142+ com .google .android .gms .ads .appopen .AppOpenAd ad = mock (com .google .android .gms .ads .appopen .AppOpenAd .class );
143+
144+ setField ("appOpenAd" , ad );
145+ setLongField ("loadTime" , System .currentTimeMillis ());
146+
147+ try (MockedStatic <AdUtils > adUtils = mockStatic (AdUtils .class );
148+ MockedStatic <com .google .android .gms .ads .appopen .AppOpenAd > appOpenAdStatic =
149+ mockStatic (com .google .android .gms .ads .appopen .AppOpenAd .class )) {
150+ appOpenAdStatic
151+ .when (() -> com .google .android .gms .ads .appopen .AppOpenAd .load (
152+ any (Context .class ),
153+ anyString (),
154+ any (AdRequest .class ),
155+ any (AppOpenAdLoadCallback .class )))
156+ .thenAnswer (invocation -> {
157+ AppOpenAdLoadCallback callback = invocation .getArgument (3 );
158+ callback .onAdLoaded (mock (com .google .android .gms .ads .appopen .AppOpenAd .class ));
159+ return null ;
160+ });
161+
162+ invokeShowAdIfAvailable (activity , listener );
163+
164+ ArgumentCaptor <FullScreenContentCallback > callbackCaptor =
165+ ArgumentCaptor .forClass (FullScreenContentCallback .class );
166+ verify (ad ).setFullScreenContentCallback (callbackCaptor .capture ());
167+ verify (ad ).show (activity );
168+ assertTrue (getBooleanField ("isShowingAd" ));
169+
170+ callbackCaptor .getValue ().onAdDismissedFullScreenContent ();
171+
172+ assertFalse (getBooleanField ("isShowingAd" ));
173+ assertFalse (getBooleanField ("isLoadingAd" ));
174+ assertNotNull (getFieldValue ("appOpenAd" ));
175+ verify (listener , times (1 )).onShowAdComplete ();
176+ adUtils .verify (() -> AdUtils .initialize (any (Context .class )));
177+ appOpenAdStatic .verify (() -> com .google .android .gms .ads .appopen .AppOpenAd .load (
178+ any (Context .class ),
179+ anyString (),
180+ any (AdRequest .class ),
181+ any (AppOpenAdLoadCallback .class )));
182+ }
183+ }
184+
185+ @ Test
186+ public void showAdIfAvailable_withAd_handlesShowFailureAndReloadFailure () throws Exception {
187+ Activity activity = mock (Activity .class );
188+ OnShowAdCompleteListener listener = mock (OnShowAdCompleteListener .class );
189+ com .google .android .gms .ads .appopen .AppOpenAd ad = mock (com .google .android .gms .ads .appopen .AppOpenAd .class );
190+ LoadAdError loadAdError = mock (LoadAdError .class );
191+ AdError adError = mock (AdError .class );
192+
193+ setField ("appOpenAd" , ad );
194+ setLongField ("loadTime" , System .currentTimeMillis ());
195+
196+ try (MockedStatic <AdUtils > adUtils = mockStatic (AdUtils .class );
197+ MockedStatic <com .google .android .gms .ads .appopen .AppOpenAd > appOpenAdStatic =
198+ mockStatic (com .google .android .gms .ads .appopen .AppOpenAd .class )) {
199+ appOpenAdStatic
200+ .when (() -> com .google .android .gms .ads .appopen .AppOpenAd .load (
201+ any (Context .class ),
202+ anyString (),
203+ any (AdRequest .class ),
204+ any (AppOpenAdLoadCallback .class )))
205+ .thenAnswer (invocation -> {
206+ AppOpenAdLoadCallback callback = invocation .getArgument (3 );
207+ callback .onAdFailedToLoad (loadAdError );
208+ return null ;
209+ });
210+
211+ invokeShowAdIfAvailable (activity , listener );
212+
213+ ArgumentCaptor <FullScreenContentCallback > callbackCaptor =
214+ ArgumentCaptor .forClass (FullScreenContentCallback .class );
215+ verify (ad ).setFullScreenContentCallback (callbackCaptor .capture ());
216+ verify (ad ).show (activity );
217+
218+ callbackCaptor .getValue ().onAdFailedToShowFullScreenContent (adError );
219+
220+ assertFalse (getBooleanField ("isShowingAd" ));
221+ assertFalse (getBooleanField ("isLoadingAd" ));
222+ assertNull (getFieldValue ("appOpenAd" ));
223+ verify (listener , times (1 )).onShowAdComplete ();
224+ adUtils .verify (() -> AdUtils .initialize (any (Context .class )));
225+ appOpenAdStatic .verify (() -> com .google .android .gms .ads .appopen .AppOpenAd .load (
226+ any (Context .class ),
227+ anyString (),
228+ any (AdRequest .class ),
229+ any (AppOpenAdLoadCallback .class )));
230+ }
231+ }
232+
134233 private Class <?> findManagerClass () {
135234 for (Class <?> clazz : AppOpenAd .class .getDeclaredClasses ()) {
136235 if ("AppOpenAdManager" .equals (clazz .getSimpleName ())) {
@@ -156,6 +255,18 @@ private void invokeShowAdIfAvailable(Activity activity, OnShowAdCompleteListener
156255 method .invoke (manager , activity , listener );
157256 }
158257
258+ private boolean getBooleanField (String fieldName ) throws Exception {
259+ Field field = managerClass .getDeclaredField (fieldName );
260+ field .setAccessible (true );
261+ return field .getBoolean (manager );
262+ }
263+
264+ private Object getFieldValue (String fieldName ) throws Exception {
265+ Field field = managerClass .getDeclaredField (fieldName );
266+ field .setAccessible (true );
267+ return field .get (manager );
268+ }
269+
159270 private void setField (String fieldName , Object value ) throws Exception {
160271 Field field = managerClass .getDeclaredField (fieldName );
161272 field .setAccessible (true );
0 commit comments