Skip to content

Commit 911bf86

Browse files
Add Robolectric tests for NativeAdLoader
1 parent c699913 commit 911bf86

File tree

3 files changed

+122
-0
lines changed

3 files changed

+122
-0
lines changed

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,4 +107,5 @@ dependencies {
107107
testImplementation libs.androidx.core.testing
108108
testImplementation libs.mockito.core
109109
testImplementation libs.mockito.inline
110+
testImplementation libs.robolectric
110111
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package com.d4rk.androidtutorials.java.ads.managers;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertTrue;
5+
import static org.mockito.ArgumentMatchers.any;
6+
import static org.mockito.Mockito.doAnswer;
7+
import static org.mockito.Mockito.mock;
8+
import static org.mockito.Mockito.mockConstruction;
9+
import static org.mockito.Mockito.when;
10+
11+
import android.content.Context;
12+
import android.view.View;
13+
import android.widget.Button;
14+
import android.widget.FrameLayout;
15+
import android.widget.TextView;
16+
17+
import androidx.test.core.app.ApplicationProvider;
18+
19+
import com.d4rk.androidtutorials.java.R;
20+
import com.google.android.gms.ads.AdListener;
21+
import com.google.android.gms.ads.AdLoader;
22+
import com.google.android.gms.ads.AdRequest;
23+
import com.google.android.gms.ads.LoadAdError;
24+
import com.google.android.gms.ads.nativead.NativeAd;
25+
import com.google.android.gms.ads.nativead.NativeAdView;
26+
27+
import org.junit.Test;
28+
import org.junit.runner.RunWith;
29+
import org.mockito.MockedConstruction;
30+
import org.robolectric.RobolectricTestRunner;
31+
32+
import java.util.concurrent.atomic.AtomicReference;
33+
34+
@RunWith(RobolectricTestRunner.class)
35+
public class NativeAdLoaderTest {
36+
37+
@Test
38+
public void loadSuccessAddsPopulatedViewAndRequestsLayout() {
39+
Context context = ApplicationProvider.getApplicationContext();
40+
TestContainer container = new TestContainer(context);
41+
AdRequest adRequest = mock(AdRequest.class);
42+
43+
NativeAd nativeAd = mock(NativeAd.class);
44+
when(nativeAd.getHeadline()).thenReturn("Headline");
45+
when(nativeAd.getBody()).thenReturn("Body");
46+
when(nativeAd.getCallToAction()).thenReturn("Install");
47+
when(nativeAd.getAdvertiser()).thenReturn("Advertiser");
48+
49+
AtomicReference<NativeAd.OnNativeAdLoadedListener> listenerRef = new AtomicReference<>();
50+
51+
try (MockedConstruction<AdLoader.Builder> mocked = mockConstruction(AdLoader.Builder.class, (builder, ctx) -> {
52+
when(builder.forNativeAd(any())).thenAnswer(inv -> {
53+
listenerRef.set(inv.getArgument(0));
54+
return builder;
55+
});
56+
when(builder.withAdListener(any())).thenReturn(builder);
57+
AdLoader adLoader = mock(AdLoader.class);
58+
when(builder.build()).thenReturn(adLoader);
59+
doAnswer(inv -> {
60+
listenerRef.get().onNativeAdLoaded(nativeAd);
61+
return null;
62+
}).when(adLoader).loadAd(any(AdRequest.class));
63+
})) {
64+
NativeAdLoader.load(context, container, R.layout.ad_home_banner_large, adRequest, null);
65+
}
66+
67+
assertEquals(1, container.getChildCount());
68+
assertTrue(container.requestedLayout);
69+
NativeAdView adView = (NativeAdView) container.getChildAt(0);
70+
TextView headline = adView.findViewById(R.id.ad_headline);
71+
assertEquals("Headline", headline.getText().toString());
72+
Button cta = adView.findViewById(R.id.ad_call_to_action);
73+
assertEquals("Install", cta.getText().toString());
74+
}
75+
76+
@Test
77+
public void loadFailureClearsContainerAndHides() {
78+
Context context = ApplicationProvider.getApplicationContext();
79+
TestContainer container = new TestContainer(context);
80+
container.addView(new View(context));
81+
AdRequest adRequest = mock(AdRequest.class);
82+
83+
AtomicReference<AdListener> listenerRef = new AtomicReference<>();
84+
85+
try (MockedConstruction<AdLoader.Builder> mocked = mockConstruction(AdLoader.Builder.class, (builder, ctx) -> {
86+
when(builder.forNativeAd(any())).thenReturn(builder);
87+
when(builder.withAdListener(any())).thenAnswer(inv -> {
88+
listenerRef.set(inv.getArgument(0));
89+
return builder;
90+
});
91+
AdLoader adLoader = mock(AdLoader.class);
92+
when(builder.build()).thenReturn(adLoader);
93+
doAnswer(inv -> {
94+
listenerRef.get().onAdFailedToLoad(mock(LoadAdError.class));
95+
return null;
96+
}).when(adLoader).loadAd(any(AdRequest.class));
97+
})) {
98+
NativeAdLoader.load(context, container, R.layout.ad_home_banner_large, adRequest, null);
99+
}
100+
101+
assertEquals(0, container.getChildCount());
102+
assertEquals(View.GONE, container.getVisibility());
103+
}
104+
105+
private static class TestContainer extends FrameLayout {
106+
boolean requestedLayout = false;
107+
108+
TestContainer(Context context) {
109+
super(context);
110+
}
111+
112+
@Override
113+
public void requestLayout() {
114+
super.requestLayout();
115+
requestedLayout = true;
116+
}
117+
}
118+
}
119+

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ lifecycle = "2.9.3"
1717
lottie = "6.6.7"
1818
mockitoCore = "5.19.0"
1919
mockitoInline = "5.2.0"
20+
robolectric = "4.13.2"
2021
navigationUi = "2.9.4"
2122
preference = "1.2.1"
2223
review = "2.0.2"
@@ -61,6 +62,7 @@ material = { module = "com.google.android.material:material", version.ref = "mat
6162
materialratingbar-library = { module = "me.zhanghai.android.materialratingbar:library", version.ref = "libraryVersion" }
6263
mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockitoCore" }
6364
mockito-inline = { module = "org.mockito:mockito-inline", version.ref = "mockitoInline" }
65+
robolectric = { module = "org.robolectric:robolectric", version.ref = "robolectric" }
6466
play-services-ads = { module = "com.google.android.gms:play-services-ads", version.ref = "playServicesAds" }
6567
review = { module = "com.google.android.play:review", version.ref = "review" }
6668
volley = { module = "com.android.volley:volley", version.ref = "volley" }

0 commit comments

Comments
 (0)