我想在执行程序的特定行之前准确测试网络连接丢失的效果。比如考虑这个执行顺序:
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之前丢失,我想测试程序的行为。我可以通过设置一个断点来检测它,在达到断点时关闭数据库,然后继续运行程序。
我想知道如何以更系统和更健全的方式实现这一目标。
答案 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连接到数据库的情况。