程序中间网络连接丢失的测试效果

时间:2012-12-07 14:55:29

标签: java unit-testing testing automated-tests

我想在执行程序的特定行之前准确测试网络连接丢失的效果。比如考虑这个执行顺序:

1. Connect to database.
2. Get country list from database.
3. Get a random country from list.
4. Get city list of this country from database.

如果网络连接在语句4之前丢失,我想测试程序的行为。我可以通过设置一个断点来检测它,在达到断点时关闭数据库,然后继续运行程序。

我想知道如何以更系统和更健全的方式实现这一目标。

2 个答案:

答案 0 :(得分:3)

让我们假设4行伪代码在MyService中,并且MyService使用MyDAO访问数据库,您将拥有以下内容:

public class MyService {

    private MyDAO myDAO;

    public MySErvice(MyDAO myDAO) {
        this.myDAO = myDAO;
    }

    public List<City> getRandomCityList() {
        List<Country> countries = myDAO.getCountries();
        Country c = pickRandom(countries);
        return myDAO.getCities(country);
    }
}

要测试它,使用像Mockito这样的模拟框架来模拟MyDAO,并将此模拟注入MyService实例。当网络因抛出getCities()方法而关闭时,使模拟抛出与真实MyDAO抛出的异常相同的异常,并且看到MyService做正确的事情:

MyDAO mockDAO = mock(MyDAO.class);
List<Country> countries = Arrays.asList(new Country(...));
when(mockDAO.getCountries()).thenReturn(countries);
when(mockDAO.getCities((Country) any(Country.class))).thenThrow(new NetworkIsDownException());

MyService underTest = new MyService(mockDAO);
// TODO call underTest.getRandomCityList() and check that it does what it should do.

答案 1 :(得分:0)

非便携式解决方案可能是修改运行测试的系统的防火墙规则,例如:在Linux上使用iptables,删除软件包,从而模拟网络中断。

更便携的解决方案可能是将数据库连接的URI包装在可以模拟网络中断的代理周围,就像ActiveMQ's SocketProxy一样。这仅适用于您的API使用URI连接到数据库的情况。