1

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

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 之前断开,我想测试程序的行为。我可以通过设置断点,在遇到断点时关闭数据库,然后继续运行程序来使用调试器对其进行测试。

我想知道如何以更系统和更强大的方式完成此任务。

4

2 回答 2

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 实例。当网络出现故障时,当它的方法被抛出时,使模拟抛出与真正的 MyDAO 抛出的异常相同的异常getCities(),看看 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.
于 2012-12-07T15:12:57.053 回答
0

一个不可移植的解决方案可能是修改运行测试的系统的防火墙规则,例如在使用 iptables 的 Linux 上,以删除包,从而模拟网络中断。

一个更便携的解决方案可能是将您的数据库连接到的 URI 包装在一些可以模拟网络中断的代理周围,就像ActiveMQ 的 SocketProxy。不过,这仅在您的 API 使用 URI 连接到数据库时才有效。

于 2012-12-07T15:16:01.063 回答