Hiya54 Huy
Hiya54 Huy

Reputation: 37

How to Unit Test a Method that changes data in Java

Suppose I have a code like below

public boolean checkForecastIfCityRaining(String name){
    result = WeatherAPICallToSomeVendor(name)
    if(result = rain)return true; else return false;


}

How would I unit test if the result data will change depending on what the API vendor is providing?

Would i mock a fixed result of every scenario and then unit test it like so?

Upvotes: 2

Views: 1449

Answers (2)

Bill K
Bill K

Reputation: 62769

A UNIT test should really only test a single method at a time (Isolate other functionality that might be invoked by that method). My current group might achieve that by writing our function like this:

public class WeatherCheck
{
    private ForecastService fs;
    public WeatherCheck(ForecastService fs)
    {
        forecastService = fs;
    }
    public boolean checkForecastIfCityRaining(String name){
        result = forecastService.weatherAPICallToSomeVendor(name)
        if(result = rain)return true; else return false;
}

This would allow us to pass a mock forecast service into the constructor. Dependency Injection would be better, but we don't do that yet.

Note: We differentiate between a Unit test and an Integration test. We still might write our Integration tests with Junit, but they have more of a tendency to go out and actually poke the service--this can give you advance warning of a failure. So you might write an integration test for ForecastService that simply calls the weatherAPICallToSomeVendor method of ForecastService and ensures a non-error result (Perhaps no exceptions or doesn't return null...).

Upvotes: 2

Woot4Moo
Woot4Moo

Reputation: 24316

I think the function needs to be rewritten as this:

public boolean checkForecastInCityCondition(String city, String condition){
    result = WeatherAPICallToSomeVendor(city)
    return result == condition;
}

Now you gain the advantage of exposing clients to care about arbitrary conditions and you can enhance with a new API as needed. From a testing perspective you can now safely write tests like this:

public void testRainingInLancaster() throws Exception{
            //your code here
}

public void testSnowInRedding() throws Exception{
           //your code here
}

And you can determine which pieces need to be mocked for testing.

Upvotes: 1

Related Questions