diff --git a/lib/geocoder.rb b/lib/geocoder.rb
index b73e6e9cf2d71eaabee62652f58751f5fbb88c04..fb0df8490bf1b87b9c62b3c0641d0c0fa35193c3 100644
--- a/lib/geocoder.rb
+++ b/lib/geocoder.rb
@@ -56,7 +56,7 @@ module Geocoder
   # All street address lookups, default first.
   #
   def street_lookups
-    [:google, :google_premier, :yahoo, :bing, :geocoder_ca, :yandex, :nominatim]
+    [:google, :google_premier, :yahoo, :bing, :geocoder_ca, :yandex, :nominatim, :test]
   end
 
   ##
diff --git a/lib/geocoder/configuration.rb b/lib/geocoder/configuration.rb
index 44baabeebf4547d063ee0798ce643a2d1aebfa86..9ab57b46a181dfd6a91495008ff857a47fb23a20 100644
--- a/lib/geocoder/configuration.rb
+++ b/lib/geocoder/configuration.rb
@@ -54,5 +54,30 @@ module Geocoder
 
       END
     end
+
+    def self.test_mode=(test_mode)
+      if test_mode
+        @original_lookup = lookup
+        self.lookup = :test
+      else
+        self.lookup = @original_lookup
+      end
+    end
+
+    def self.add_stub(query, results)
+      stubs[query] = results
+    end
+
+    def self.read_stub(query)
+      stubs.fetch(query) { raise ArgumentError, "unknown stub request #{query}" }
+    end
+
+    def self.stubs
+      @stubs ||= {}
+    end
+
+    def self.reset_stubs
+      @stubs = {}
+    end
   end
 end
diff --git a/lib/geocoder/lookups/test.rb b/lib/geocoder/lookups/test.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c9aed395c96f13c25e0deb46b6745149526f526b
--- /dev/null
+++ b/lib/geocoder/lookups/test.rb
@@ -0,0 +1,16 @@
+require 'geocoder/lookups/base'
+require 'geocoder/results/test'
+
+module Geocoder
+  module Lookup
+    class Test < Base
+
+      private
+
+      def results(query, reverse = false)
+        Geocoder::Configuration.read_stub(query)
+      end
+
+    end
+  end
+end
diff --git a/lib/geocoder/results/test.rb b/lib/geocoder/results/test.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d029d1a71b5b8418a5fcf2d0eec6f3c08e565042
--- /dev/null
+++ b/lib/geocoder/results/test.rb
@@ -0,0 +1,29 @@
+require 'geocoder/results/base'
+
+module Geocoder
+  module Result
+    class Test < Base
+
+      def address
+        @data['address']
+      end
+
+      def state
+        @data['state']
+      end
+
+      def state_code
+        @data['state_code']
+      end
+
+      def country
+        @data['country']
+      end
+
+      def country_code
+        @data['country_code']
+      end
+
+    end
+  end
+end
diff --git a/test/test_mode_test.rb b/test/test_mode_test.rb
new file mode 100644
index 0000000000000000000000000000000000000000..51d3371f8b07b7c88e1caada28f6e74e48750993
--- /dev/null
+++ b/test/test_mode_test.rb
@@ -0,0 +1,54 @@
+require 'test_helper'
+
+class TestModeTest < Test::Unit::TestCase
+
+  def teardown
+    Geocoder::Configuration.reset_stubs
+  end
+
+  def test_search_with_known_stub
+    Geocoder::Configuration.test_mode = true
+    attributes = {
+      'latitude'   => 40.7143528,
+      'longitude'  => -74.0059731,
+      'address'    => 'New York, NY, USA',
+      'state'      => 'New York',
+      'state_code' => 'NY',
+      'country'    => 'United States',
+      'country_code' => 'US',
+    }
+    coordinates = [attributes['latitude'], attributes['longitude']]
+
+    Geocoder::Configuration.add_stub("New York, NY", [attributes])
+
+    results = Geocoder.search("New York, NY")
+    assert_equal 1, results.size
+
+    result = results.first
+    assert_equal coordinates,                result.coordinates
+    assert_equal attributes['latitude'],     result.latitude
+    assert_equal attributes['longitude'],    result.longitude
+    assert_equal attributes['address'],      result.address
+    assert_equal attributes['state'],        result.state
+    assert_equal attributes['state_code'],   result.state_code
+    assert_equal attributes['country'],      result.country
+    assert_equal attributes['country_code'], result.country_code
+  end
+
+  def test_search_with_unknown_stub
+    Geocoder::Configuration.test_mode = true
+
+    assert_raise ArgumentError do
+      Geocoder.search("New York, NY")
+    end
+  end
+
+  def test_turning_off_test_mode_restores_lookup
+    original_lookup = Geocoder::Configuration.lookup
+    Geocoder::Configuration.test_mode = true
+    Geocoder::Configuration.test_mode = false
+
+    assert_equal original_lookup, Geocoder::Configuration.lookup
+  end
+
+end