views:

147

answers:

7

I have some methods in my app that make http requests. Is there a good way to simulate network failures and bad responses for the unit tests?

+1  A: 

For network failures nothing beats first unplugging your computers ethernet cable (or d/c it's wireless) and then unplugging whatever cable gives you access to the cloud.

If by bad responses you mean HTTP errors you can write ASP scripts that will always throw specific errors. If you want to test malformed HTTP packets you'll have to write a simple socket app to do that.

Spencer Ruport
A: 

Pull out your lan wire, or turn off your wireless router while the requests are being made :)

karim79
+10  A: 

Suitable Mock Objects should let you perform such simulations easily; if you're unfamiliar with the concept, there's a good tutorial here.

Alex Martelli
+1 Mock it, don't mess with pulling wires.
S.Lott
+3  A: 

Have You tried HTTPUnit and JWebUnit?

George Stocker
A: 

What we do in this situation is abstract the layer that's making the call. Instead of having your logic directly make the http request, have your code call a function. Within that function can be something like:

if (in_test) {
   response = get_test_response();
} else {
   response = make_http_request();
}

Then you can have your unit tests set some value accessible by the get_test_response() function. This way you can programatically change what the result of that call will be.

Chris Simmons
+1  A: 

Wrap the library that makes the HTTP calls (e.g. java.net.URLConnection or Commons HttpClient) behind an interface, and then write implementations or mocks of that interface that simulates the failure conditions.

Your interface can just represent the operations that your application needs to perform, rather than the whole range of HTTP client functionality.

skaffman
A: 

Maybe Spring test mocks would be of some assistance.

duffymo