Skip to content

Commit 668d692

Browse files
Merge pull request #195 from MihaiCristianCondrea/codex/add-unit-tests-for-appopenadmanager
Add unit tests for AppOpenAdManager behavior
2 parents 3799777 + 4c67a43 commit 668d692

File tree

1 file changed

+170
-0
lines changed

1 file changed

+170
-0
lines changed
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
package com.d4rk.androidtutorials.java.ads.managers;
2+
3+
import static org.junit.Assert.assertFalse;
4+
import static org.junit.Assert.assertTrue;
5+
import static org.mockito.ArgumentMatchers.any;
6+
import static org.mockito.ArgumentMatchers.anyString;
7+
import static org.mockito.Mockito.mock;
8+
import static org.mockito.Mockito.mockStatic;
9+
import static org.mockito.Mockito.times;
10+
import static org.mockito.Mockito.verify;
11+
import static org.mockito.Mockito.when;
12+
13+
import android.app.Activity;
14+
import android.app.Application;
15+
import android.content.Context;
16+
17+
import com.d4rk.androidtutorials.java.ads.AdUtils;
18+
import com.d4rk.androidtutorials.java.ads.managers.AppOpenAd.OnShowAdCompleteListener;
19+
import com.google.android.gms.ads.AdRequest;
20+
import com.google.android.gms.ads.FullScreenContentCallback;
21+
import com.google.android.gms.ads.appopen.AppOpenAd.AppOpenAdLoadCallback;
22+
23+
import org.junit.Before;
24+
import org.junit.Test;
25+
import org.mockito.ArgumentCaptor;
26+
import org.mockito.MockedStatic;
27+
28+
import java.lang.reflect.Constructor;
29+
import java.lang.reflect.Field;
30+
import java.lang.reflect.Method;
31+
import java.util.concurrent.TimeUnit;
32+
33+
/**
34+
* Unit tests for {@link AppOpenAd.AppOpenAdManager}.
35+
*/
36+
public class AppOpenAdManagerTest {
37+
38+
private Class<?> managerClass;
39+
private Object manager;
40+
private Application application;
41+
42+
@Before
43+
public void setUp() throws Exception {
44+
application = mock(Application.class);
45+
when(application.getApplicationContext()).thenReturn(application);
46+
47+
managerClass = findManagerClass();
48+
Constructor<?> constructor = managerClass.getDeclaredConstructor(Application.class);
49+
constructor.setAccessible(true);
50+
manager = constructor.newInstance(application);
51+
}
52+
53+
@Test
54+
public void isAdAvailable_returnsFalseWhenAdIsNull() throws Exception {
55+
setField("appOpenAd", null);
56+
setLongField("loadTime", System.currentTimeMillis());
57+
58+
assertFalse(invokeIsAdAvailable());
59+
}
60+
61+
@Test
62+
public void isAdAvailable_returnsFalseWhenLoadTimeTooOld() throws Exception {
63+
com.google.android.gms.ads.appopen.AppOpenAd ad = mock(com.google.android.gms.ads.appopen.AppOpenAd.class);
64+
setField("appOpenAd", ad);
65+
long staleTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(5);
66+
setLongField("loadTime", staleTime);
67+
68+
assertFalse(invokeIsAdAvailable());
69+
}
70+
71+
@Test
72+
public void isAdAvailable_returnsTrueWhenAdFresh() throws Exception {
73+
com.google.android.gms.ads.appopen.AppOpenAd ad = mock(com.google.android.gms.ads.appopen.AppOpenAd.class);
74+
setField("appOpenAd", ad);
75+
long recentTime = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1);
76+
setLongField("loadTime", recentTime);
77+
78+
assertTrue(invokeIsAdAvailable());
79+
}
80+
81+
@Test
82+
public void showAdIfAvailable_withoutAd_loadsNewAd() throws Exception {
83+
Activity activity = mock(Activity.class);
84+
OnShowAdCompleteListener listener = mock(OnShowAdCompleteListener.class);
85+
86+
try (MockedStatic<AdUtils> adUtils = mockStatic(AdUtils.class);
87+
MockedStatic<com.google.android.gms.ads.appopen.AppOpenAd> appOpenAdStatic =
88+
mockStatic(com.google.android.gms.ads.appopen.AppOpenAd.class)) {
89+
com.google.android.gms.ads.appopen.AppOpenAd loadedAd = mock(com.google.android.gms.ads.appopen.AppOpenAd.class);
90+
91+
appOpenAdStatic
92+
.when(() -> com.google.android.gms.ads.appopen.AppOpenAd.load(
93+
any(Context.class),
94+
anyString(),
95+
any(AdRequest.class),
96+
any(AppOpenAdLoadCallback.class)))
97+
.thenAnswer(invocation -> {
98+
AppOpenAdLoadCallback callback = invocation.getArgument(3);
99+
callback.onAdLoaded(loadedAd);
100+
return null;
101+
});
102+
103+
invokeShowAdIfAvailable(activity, listener);
104+
105+
adUtils.verify(() -> AdUtils.initialize(any(Context.class)));
106+
appOpenAdStatic.verify(() -> com.google.android.gms.ads.appopen.AppOpenAd.load(
107+
any(Context.class),
108+
anyString(),
109+
any(AdRequest.class),
110+
any(AppOpenAdLoadCallback.class)));
111+
}
112+
113+
verify(listener, times(1)).onShowAdComplete();
114+
}
115+
116+
@Test
117+
public void showAdIfAvailable_withAd_doesNotShowTwiceWhileShowing() throws Exception {
118+
Activity activity = mock(Activity.class);
119+
OnShowAdCompleteListener listener = mock(OnShowAdCompleteListener.class);
120+
com.google.android.gms.ads.appopen.AppOpenAd ad = mock(com.google.android.gms.ads.appopen.AppOpenAd.class);
121+
122+
setField("appOpenAd", ad);
123+
setLongField("loadTime", System.currentTimeMillis());
124+
125+
invokeShowAdIfAvailable(activity, listener);
126+
invokeShowAdIfAvailable(activity, listener);
127+
128+
ArgumentCaptor<FullScreenContentCallback> callbackCaptor =
129+
ArgumentCaptor.forClass(FullScreenContentCallback.class);
130+
verify(ad, times(1)).setFullScreenContentCallback(callbackCaptor.capture());
131+
verify(ad, times(1)).show(activity);
132+
}
133+
134+
private Class<?> findManagerClass() {
135+
for (Class<?> clazz : AppOpenAd.class.getDeclaredClasses()) {
136+
if ("AppOpenAdManager".equals(clazz.getSimpleName())) {
137+
return clazz;
138+
}
139+
}
140+
throw new IllegalStateException("AppOpenAdManager class not found");
141+
}
142+
143+
private boolean invokeIsAdAvailable() throws Exception {
144+
Method method = managerClass.getDeclaredMethod("isAdAvailable");
145+
method.setAccessible(true);
146+
return (boolean) method.invoke(manager);
147+
}
148+
149+
private void invokeShowAdIfAvailable(Activity activity, OnShowAdCompleteListener listener)
150+
throws Exception {
151+
Method method = managerClass.getDeclaredMethod(
152+
"showAdIfAvailable",
153+
Activity.class,
154+
OnShowAdCompleteListener.class);
155+
method.setAccessible(true);
156+
method.invoke(manager, activity, listener);
157+
}
158+
159+
private void setField(String fieldName, Object value) throws Exception {
160+
Field field = managerClass.getDeclaredField(fieldName);
161+
field.setAccessible(true);
162+
field.set(manager, value);
163+
}
164+
165+
private void setLongField(String fieldName, long value) throws Exception {
166+
Field field = managerClass.getDeclaredField(fieldName);
167+
field.setAccessible(true);
168+
field.setLong(manager, value);
169+
}
170+
}

0 commit comments

Comments
 (0)