diff --git a/test/com/facebook/buck/java/AccumulateClassNamesTest.java b/test/com/facebook/buck/java/AccumulateClassNamesTest.java
index 8354b73..87a7c83 100644
--- a/test/com/facebook/buck/java/AccumulateClassNamesTest.java
+++ b/test/com/facebook/buck/java/AccumulateClassNamesTest.java
@@ -30,6 +30,7 @@
 import com.facebook.buck.rules.BuildRuleType;
 import com.facebook.buck.rules.FakeAbstractBuildRuleBuilderParams;
 import com.facebook.buck.rules.FakeBuildableContext;
+import com.facebook.buck.rules.FakeOnDiskBuildInfo;
 import com.facebook.buck.rules.OnDiskBuildInfo;
 import com.facebook.buck.rules.Sha1HashCode;
 import com.facebook.buck.step.ExecutionContext;
@@ -37,7 +38,6 @@
 import com.facebook.buck.step.TestExecutionContext;
 import com.facebook.buck.testutil.MoreAsserts;
 import com.facebook.buck.util.ProjectFilesystem;
-import com.google.common.base.Optional;
 import com.google.common.base.Suppliers;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSortedMap;
@@ -135,17 +135,17 @@
   public void testInitializeFromDisk() throws IOException {
     BuildTarget buildTarget = new BuildTarget("//foo", "bar");
     JavaLibraryRule javaRule = new FakeJavaLibraryRule(buildTarget);
-
     AccumulateClassNames accumulateClassNames = new AccumulateClassNames(buildTarget, javaRule);
 
-    OnDiskBuildInfo onDiskBuildInfo = createMock(OnDiskBuildInfo.class);
+    ProjectFilesystem projectFilesystem = createMock(ProjectFilesystem.class);
     List<String> lines = ImmutableList.of(
         "com/example/Bar 087b7707a5f8e0a2adf5652e3cd2072d89a197dc",
         "com/example/Baz 62b1c2510840c0de55c13f66065a98a719be0f19",
         "com/example/Foo e4fccb7520b7795e632651323c63217c9f59f72a");
-    expect(onDiskBuildInfo.getOutputFileContentsByLine(accumulateClassNames)).andReturn(lines);
-    expect(onDiskBuildInfo.getHash(AbiRule.ABI_KEY_ON_DISK_METADATA))
-        .andReturn(Optional.of(new Sha1HashCode("f7d6d1efa11c8ceef36cc56b0ec6c3a20ddbf19f")));
+    expect(projectFilesystem.readLines(Paths.get("buck-out/gen/foo/bar.classes.txt")))
+        .andReturn(lines);
+    OnDiskBuildInfo onDiskBuildInfo = new FakeOnDiskBuildInfo(buildTarget, projectFilesystem)
+        .putMetadata(AbiRule.ABI_KEY_ON_DISK_METADATA, "f7d6d1efa11c8ceef36cc56b0ec6c3a20ddbf19f");
 
     replayAll();
     accumulateClassNames.initializeFromDisk(onDiskBuildInfo);
diff --git a/test/com/facebook/buck/rules/AbstractCachingBuildRuleTest.java b/test/com/facebook/buck/rules/AbstractCachingBuildRuleTest.java
index 57f7ce4..fc17c2c 100644
--- a/test/com/facebook/buck/rules/AbstractCachingBuildRuleTest.java
+++ b/test/com/facebook/buck/rules/AbstractCachingBuildRuleTest.java
@@ -165,8 +165,8 @@
     expect(context.getProjectRoot()).andReturn(createMock(Path.class));
 
     // Configure the OnDiskBuildInfo.
-    OnDiskBuildInfo onDiskBuildInfo = createMock(OnDiskBuildInfo.class);
-    expect(onDiskBuildInfo.getRuleKey()).andReturn(Optional.<RuleKey>absent());
+    ProjectFilesystem projectFilesystem = createMock(ProjectFilesystem.class);
+    OnDiskBuildInfo onDiskBuildInfo = new FakeOnDiskBuildInfo(buildTarget, projectFilesystem);
     expect(context.createOnDiskBuildInfoFor(buildTarget)).andReturn(onDiskBuildInfo);
 
     // Configure the BuildInfoRecorder.
@@ -248,19 +248,20 @@
            /* ruleKeyWithoutDeps */ capture(new Capture<RuleKey>())))
         .andReturn(buildInfoRecorder);
 
+    ProjectFilesystem projectFilesystem = createMock(ProjectFilesystem.class);
     // Populate the metadata that should be read from disk.
-    OnDiskBuildInfo onDiskBuildInfo = createMock(OnDiskBuildInfo.class);
-    // The RuleKey on disk should be different from the current RuleKey in memory, so reverse() it.
-    expect(onDiskBuildInfo.getRuleKey()).andReturn(
-        Optional.of(reverse(buildRule.getRuleKey())));
-    // However, the RuleKey not including the deps in memory should be the same as the one on disk.
-    expect(onDiskBuildInfo.getRuleKeyWithoutDeps()).andReturn(
-        Optional.of(new RuleKey(TestAbstractCachingBuildRule.RULE_KEY_WITHOUT_DEPS_HASH)));
-    // Similarly, the ABI key for the deps in memory should be the same as the one on disk.
-    expect(onDiskBuildInfo.getHash(AbiRule.ABI_KEY_FOR_DEPS_ON_DISK_METADATA)).andReturn(
-        Optional.of(new Sha1HashCode(TestAbstractCachingBuildRule.ABI_KEY_FOR_DEPS_HASH)));
-    expect(onDiskBuildInfo.getValue(AbiRule.ABI_KEY_ON_DISK_METADATA)).andReturn(
-        Optional.of("At some point, this method call should go away."));
+    OnDiskBuildInfo onDiskBuildInfo = new FakeOnDiskBuildInfo(buildTarget, projectFilesystem)
+         // The RuleKey on disk should be different from the current RuleKey in memory, so reverse()
+         // it.
+         .setRuleKey(reverse(buildRule.getRuleKey()))
+         // However, the RuleKey not including the deps in memory should be the same as the one on
+         // disk.
+         .setRuleKeyWithoutDeps(new RuleKey(TestAbstractCachingBuildRule.RULE_KEY_WITHOUT_DEPS_HASH))
+         // Similarly, the ABI key for the deps in memory should be the same as the one on disk.
+        .putMetadata(AbiRule.ABI_KEY_FOR_DEPS_ON_DISK_METADATA,
+            TestAbstractCachingBuildRule.ABI_KEY_FOR_DEPS_HASH)
+        .putMetadata(AbiRule.ABI_KEY_ON_DISK_METADATA,
+            "At some point, this method call should go away.");
 
     // This metadata must be added to the buildInfoRecorder so that it is written as part of
     // writeMetadataToDisk().
diff --git a/test/com/facebook/buck/rules/BUCK b/test/com/facebook/buck/rules/BUCK
index 5c72a7e..f8eefad 100644
--- a/test/com/facebook/buck/rules/BUCK
+++ b/test/com/facebook/buck/rules/BUCK
@@ -7,6 +7,7 @@
     'FakeBuildableContext.java',
     'FakeBuildRule.java',
     'FakeBuildRuleParams.java',
+    'FakeOnDiskBuildInfo.java',
     'FakeRuleKeyBuilderFactory.java',
     'FakeTestRule.java',
     'NonCheckingBuildRuleFactoryParams.java',
diff --git a/test/com/facebook/buck/rules/FakeOnDiskBuildInfo.java b/test/com/facebook/buck/rules/FakeOnDiskBuildInfo.java
new file mode 100644
index 0000000..99926ae
--- /dev/null
+++ b/test/com/facebook/buck/rules/FakeOnDiskBuildInfo.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2013-present Facebook, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License. You may obtain
+ * a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.facebook.buck.rules;
+
+import com.facebook.buck.model.BuildTarget;
+import com.facebook.buck.util.ProjectFilesystem;
+import com.google.common.base.Optional;
+import com.google.common.collect.Maps;
+
+import java.util.Map;
+
+import javax.annotation.Nullable;
+
+public class FakeOnDiskBuildInfo extends OnDiskBuildInfo {
+
+  @Nullable private RuleKey ruleKey;
+  @Nullable private RuleKey ruleKeyWithoutDeps;
+  private Map<String, String> metadata = Maps.newHashMap();
+
+  public FakeOnDiskBuildInfo(BuildTarget target, ProjectFilesystem projectFilesystem) {
+    super(target, projectFilesystem);
+  }
+
+  /** @return this */
+  public FakeOnDiskBuildInfo setRuleKey(@Nullable RuleKey ruleKey) {
+    this.ruleKey = ruleKey;
+    return this;
+  }
+
+  @Override
+  public Optional<RuleKey> getRuleKey() {
+    return Optional.fromNullable(ruleKey);
+  }
+
+  /** @return this */
+  public FakeOnDiskBuildInfo setRuleKeyWithoutDeps(@Nullable RuleKey ruleKeyWithoutDeps) {
+    this.ruleKeyWithoutDeps = ruleKeyWithoutDeps;
+    return this;
+  }
+
+  @Override
+  public Optional<RuleKey> getRuleKeyWithoutDeps() {
+    return Optional.fromNullable(ruleKeyWithoutDeps);
+  }
+
+  /** @return this */
+  public FakeOnDiskBuildInfo putMetadata(String key, String value) {
+    this.metadata.put(key, value);
+    return this;
+  }
+
+  @Override
+  public Optional<String> getValue(String key) {
+    return Optional.fromNullable(metadata.get(key));
+  }
+}
