SocketTimeoutException
を使用してwithFixedDelay
をシミュレートできることは知っていますが、ConnectionTimeoutException
はどうですか?
はい、WireMockでこれを行うには、Java APIに対してaddDelayBeforeProcessingRequests(300)
を呼び出すか、以下をhttp://<Host>:<port>/__admin/socket-delay
に投稿します。
{ "milliseconds": 300 }
(明らかに、300を遅延させたいミリ秒数に置き換えます)
チェックアウト https://github.com/tomakehurst/saboteur これにより、ネットワークの問題をシミュレートできます。または、iptablesを使用して自分で行うこともできます。
バージョン2.0.8-beta なので、この質問に対する答えは「いいえ」だったようです。
トム(WireMockの作者)が理由を説明します このGitHubの問題で :
現時点では、純粋なJavaで接続タイムアウトを確実に強制することは基本的に不可能です。
以前は、ソケットで
.accept()
を呼び出す前に遅延を挿入できたのですが、実装の内部が変更されたため、しばらく前に機能しなくなったと思います。現時点での私の推奨事項は、ネットワークスタックのレベルで機能するツールを使用することです。
iptables ... -j DROP
typeコマンドでうまくいきます。または、これをある程度自動化したい場合は、 https://github.com/tomakehurst/saboteur や https: //github.com/alexei-led/pumba 。
彼はまた、WireMockを停止するだけでは同じことは達成されないと説明しています。
wireMockをシャットダウンしても、同じ効果はありません。ポートがリッスンされていない場合、TCP
RST
(リセット)パケットが返されますが、接続タイムアウトが発生します最初のSYN
パケットの後、タイムアウトウィンドウでサーバーから何も返されない場合。
WireMock.Net を使用する場合、遅延を追加することもできます。
例:
var server = WireMockServer.Start();
// add a delay of 30 seconds for all requests
server.AddRequestProcessingDelay(TimeSpan.FromSeconds(30));
または
var server = WireMockServer.Start();
server
.Given(Request.Create().WithPath("/slow"))
.RespondWith(
Responses.Create()
.WithStatusCode(200)
.WithBody(@"{ ""msg"": ""Hello I'm a little bit slow!"" }")
.WithDelay(TimeSpan.FromSeconds(10)
)
);
Java.net.ConnectExceptionは基本的に、意図したパーティへのネットワーク接続を確立できないことを意味します。それを考慮して、wiremockインスタンスを停止したところ、正常に機能しました。
私のサードパーティのAPI呼び出しの実装は、この例外をキャッチし、エラーメッセージでHTTP 500を再スローします(これが私が主張しようとしていることです)
@Before
public void setUp() {
wireMock.start();
}
@After
public void clean() {
wireMock.resetMappings();
}
@Test
public void shouldSimulateConnectionTimeout() {
//given - STOP THE WIREMOCK
wireMock.stop();
//when
Response response = getTarget("external api URL")
.request()
.post(entity(event, APPLICATION_JSON_TYPE));
//then
assertEquals(500, response.getStatus());
assertEquals("{\"message\" : \"Java.net.ConnectException: Connection refused\"}", response.readEntity(String.class));
}