Skip to content

Commit 09ad702

Browse files
Merge pull request #228 from MihaiCristianCondrea/codex/mock-mobileads-in-ads-tests
Ensure AdUtils initialization guards against null context
2 parents 1874c58 + b8dbc68 commit 09ad702

File tree

2 files changed

+44
-5
lines changed

2 files changed

+44
-5
lines changed

app/src/main/java/com/d4rk/androidtutorials/java/ads/AdUtils.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import com.google.android.gms.ads.AdView;
99
import com.google.android.gms.ads.MobileAds;
1010

11+
import java.util.Objects;
12+
1113
public final class AdUtils {
1214
private static boolean initialized = false;
1315

@@ -17,7 +19,9 @@ private AdUtils() {
1719

1820
public static synchronized void initialize(Context context) {
1921
if (!initialized) {
20-
MobileAds.initialize(context.getApplicationContext());
22+
Context nonNullContext = Objects.requireNonNull(context, "context == null");
23+
Context appContext = nonNullContext.getApplicationContext();
24+
MobileAds.initialize(appContext != null ? appContext : nonNullContext);
2125
initialized = true;
2226
}
2327
}

app/src/test/java/com/d4rk/androidtutorials/java/ads/AdUtilsTest.java

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.d4rk.androidtutorials.java.ads;
22

3+
import static org.junit.Assert.assertFalse;
4+
import static org.junit.Assert.assertThrows;
5+
import static org.junit.Assert.assertTrue;
36
import static org.mockito.Mockito.*;
47

58
import android.content.Context;
@@ -21,16 +24,32 @@
2124
*/
2225
public class AdUtilsTest {
2326

27+
private Field initializedField;
28+
2429
@Before
2530
public void setUp() throws Exception {
2631
// Reset the initialized flag before each test
27-
Field field = AdUtils.class.getDeclaredField("initialized");
28-
field.setAccessible(true);
29-
field.set(null, false);
32+
initializedField = AdUtils.class.getDeclaredField("initialized");
33+
initializedField.setAccessible(true);
34+
initializedField.set(null, false);
3035
}
3136

3237
@Test
33-
public void initialize_callsMobileAdsInitializeOnlyOnce() {
38+
public void initialize_firstCallInitializesAdsAndSetsFlag() throws Exception {
39+
Context context = mock(Context.class);
40+
when(context.getApplicationContext()).thenReturn(context);
41+
42+
try (MockedStatic<MobileAds> mobileAds = mockStatic(MobileAds.class)) {
43+
AdUtils.initialize(context);
44+
45+
mobileAds.verify(() -> MobileAds.initialize(context), times(1));
46+
}
47+
48+
assertTrue(isInitialized());
49+
}
50+
51+
@Test
52+
public void initialize_subsequentCallsDoNothing() throws Exception {
3453
Context context = mock(Context.class);
3554
when(context.getApplicationContext()).thenReturn(context);
3655

@@ -40,6 +59,18 @@ public void initialize_callsMobileAdsInitializeOnlyOnce() {
4059

4160
mobileAds.verify(() -> MobileAds.initialize(context), times(1));
4261
}
62+
63+
assertTrue(isInitialized());
64+
}
65+
66+
@Test
67+
public void initialize_withNullContext_throwsNullPointerException() throws Exception {
68+
try (MockedStatic<MobileAds> mobileAds = mockStatic(MobileAds.class)) {
69+
assertThrows(NullPointerException.class, () -> AdUtils.initialize(null));
70+
mobileAds.verifyNoInteractions();
71+
}
72+
73+
assertFalse(isInitialized());
4374
}
4475

4576
@Test
@@ -84,4 +115,8 @@ public void loadBanner_withOtherView_doesNothing() {
84115
mobileAds.verifyNoInteractions();
85116
}
86117
}
118+
119+
private boolean isInitialized() throws IllegalAccessException {
120+
return initializedField.getBoolean(null);
121+
}
87122
}

0 commit comments

Comments
 (0)