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

移植性のない解決策は、テストが実行されているシステムのファイアウォール ルールを変更することです。たとえば、Linux で iptables を使用して、パッケージを削除し、ネットワークの停止をシミュレートします。

より移植性の高い解決策は、 ActiveMQ の SocketProxy のように、ネットワークの停止をシミュレートできるプロキシの周りに、データベースが接続している URI をラップすることです。ただし、これは、API が URI を使用してデータベースに接続する場合にのみ機能します。

于 2012-12-07T15:16:01.063 に答える