diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalyLoader.java b/src/com/android/settings/fuelgauge/anomaly/AnomalyLoader.java
index b182a03..264c390 100644
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalyLoader.java
+++ b/src/com/android/settings/fuelgauge/anomaly/AnomalyLoader.java
@@ -17,12 +17,14 @@
 package com.android.settings.fuelgauge.anomaly;
 
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.os.BatteryStats;
 import android.os.Bundle;
 import android.os.UserManager;
 import android.support.annotation.VisibleForTesting;
 
 import com.android.internal.os.BatteryStatsHelper;
+import com.android.settings.Utils;
 import com.android.settings.utils.AsyncLoader;
 
 import java.util.ArrayList;
@@ -33,6 +35,7 @@
  * an empty list if there is no anomaly.
  */
 public class AnomalyLoader extends AsyncLoader<List<Anomaly>> {
+    private static final boolean USE_FAKE_DATA = false;
     private BatteryStatsHelper mBatteryStatsHelper;
     private String mPackageName;
     private UserManager mUserManager;
@@ -56,7 +59,6 @@
      *
      * This constructor will create {@link BatteryStatsHelper} in background thread.
      *
-     * @param context
      * @param packageName if set, only finds anomalies for this package. If {@code null},
      *                    detects all anomalies of this type.
      */
@@ -81,6 +83,9 @@
 
     @Override
     public List<Anomaly> loadInBackground() {
+        if (USE_FAKE_DATA) {
+            return generateFakeData();
+        }
         if (mBatteryStatsHelper == null) {
             mBatteryStatsHelper = new BatteryStatsHelper(getContext());
             mBatteryStatsHelper.create((Bundle) null);
@@ -99,4 +104,31 @@
         return anomalies;
     }
 
+    @VisibleForTesting
+    List<Anomaly> generateFakeData() {
+        final List<Anomaly> anomalies = new ArrayList<>();
+        final Context context = getContext();
+        try {
+            final String packageName = "com.android.settings";
+            final CharSequence displayName = "Settings";
+            final int uid = context.getPackageManager().getPackageUid(packageName, 0);
+
+            anomalies.add(new Anomaly.Builder()
+                    .setUid(uid)
+                    .setType(Anomaly.AnomalyType.WAKE_LOCK)
+                    .setPackageName(packageName)
+                    .setDisplayName(displayName)
+                    .build());
+            anomalies.add(new Anomaly.Builder()
+                    .setUid(uid)
+                    .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
+                    .setPackageName(packageName)
+                    .setDisplayName(displayName)
+                    .build());
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+        }
+        return anomalies;
+    }
+
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyLoaderTest.java
index 1ca29a1..6f4b1bc 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyLoaderTest.java
@@ -20,11 +20,13 @@
 
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.os.UserManager;
 
 import com.android.internal.os.BatteryStatsHelper;
@@ -48,6 +50,9 @@
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class AnomalyLoaderTest {
+    private static final String PACKAGE_NAME = "com.android.settings";
+    private static final CharSequence DISPLAY_NAME = "Settings";
+    private static final int UID = 0;
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Context mContext;
     @Mock
@@ -67,12 +72,13 @@
     private AnomalyLoader mAnomalyLoader;
 
     @Before
-    public void setUp() {
+    public void setUp() throws PackageManager.NameNotFoundException {
         MockitoAnnotations.initMocks(this);
 
         FakeFeatureFactory.setupForTest(mContext);
         doReturn(true).when(mAnomalyDetectionPolicy).isAnomalyDetectorEnabled(anyInt());
         doReturn(mUserManager).when(mContext).getSystemService(Context.USER_SERVICE);
+        when(mContext.getPackageManager().getPackageUid(anyString(), anyInt())).thenReturn(UID);
 
         mWakeLockAnomalies = new ArrayList<>();
         mWakeLockAnomaly = createAnomaly(Anomaly.AnomalyType.WAKE_LOCK);
@@ -105,6 +111,16 @@
     private Anomaly createAnomaly(@Anomaly.AnomalyType int type) {
         return new Anomaly.Builder()
                 .setType(type)
+                .setUid(UID)
+                .setPackageName(PACKAGE_NAME)
+                .setDisplayName(DISPLAY_NAME)
                 .build();
     }
+
+    @Test
+    public void testGenerateFakeData() {
+        List<Anomaly> anomalies = mAnomalyLoader.generateFakeData();
+
+        assertThat(anomalies).containsExactly(mWakeLockAnomaly, mWakeupAlarmAnomaly);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java
index 2996e4d..cab612e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java
@@ -171,7 +171,7 @@
     }
 
     @Test
-    public void testDetectAnomalies_containsTargetpackage_detectIt() {
+    public void testDetectAnomalies_containsTargetPackage_detectIt() {
         doReturn(TARGET_UID).when(mBatteryUtils).getPackageUid(TARGET_PACKAGE_NAME);
         final Anomaly targetAnomaly = new Anomaly.Builder()
                 .setUid(TARGET_UID)
