如何对在Java中更改数据的方法进行单元测试

时间:2018-07-27 19:52:55

标签: java unit-testing junit

假设我有如下代码

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


}

我将如何对结果数据进行更改进行单元测试,具体取决于 API供应商提供了什么?

我会模拟每个场景的固定结果,然后进行单元测试 像这样吗?

2 个答案:

答案 0 :(得分:2)

一个UNIT测试实际上应该一次只测试一个方法(隔离可能由该方法调用的其他功能)。我目前的小组可以通过这样编写我们的函数来实现这一点:

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;
}

这将使我们能够将模拟预测服务传递给构造函数。依赖注入会更好,但是我们还没有这样做。

注意:我们区分单元测试和集成测试。我们仍然可以使用Junit编写集成测试,但是它们更倾向于退出并实际戳破服务-这可以给您预先警告失败。因此,您可以为ForecastService编写一个集成测试,该测试仅调用ForecastService的weatherAPICallToSomeVendor方法并确保无错误结果(也许没有异常或不返回null ...)。

答案 1 :(得分:1)

我认为该函数需要这样重写:

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

现在,您获得了使客户端关心任意conditions的优势,并且可以根据需要使用新的API进行增强。从测试的角度来看,您现在可以安全地编写如下测试:

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

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

您可以确定需要模拟哪些零件进行测试。