BAEL-424 code for javaslang Try (#1068)
* BAEL-424 code for javaslang Try * BAEL-424 more api examples of try * BAEL-424 less verbose names of test, two exceptions types in pattern matching
This commit is contained in:
parent
a0781d1d88
commit
fb50f56cfd
|
@ -0,0 +1,21 @@
|
|||
package com.baeldung.javaslang.exception.handling;
|
||||
|
||||
import com.baeldung.javaslang.exception.handling.client.ClientException;
|
||||
import com.baeldung.javaslang.exception.handling.client.HttpClient;
|
||||
import com.baeldung.javaslang.exception.handling.client.Response;
|
||||
|
||||
public class JavaTryCatch {
|
||||
private HttpClient httpClient;
|
||||
|
||||
public JavaTryCatch(HttpClient httpClient) {
|
||||
this.httpClient = httpClient;
|
||||
}
|
||||
|
||||
public Response getResponse() {
|
||||
try {
|
||||
return httpClient.call();
|
||||
} catch (ClientException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
package com.baeldung.javaslang.exception.handling;
|
||||
|
||||
|
||||
import com.baeldung.javaslang.exception.handling.client.HttpClient;
|
||||
import com.baeldung.javaslang.exception.handling.client.Response;
|
||||
import javaslang.control.Try;
|
||||
|
||||
public class JavaslangTry {
|
||||
private final HttpClient httpClient;
|
||||
|
||||
public JavaslangTry(HttpClient httpClient) {
|
||||
this.httpClient = httpClient;
|
||||
}
|
||||
|
||||
public Try<Response> getResponse() {
|
||||
return Try.of(httpClient::call);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package com.baeldung.javaslang.exception.handling.client;
|
||||
|
||||
|
||||
public class ClientException extends Exception {
|
||||
public ClientException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
package com.baeldung.javaslang.exception.handling.client;
|
||||
|
||||
|
||||
public interface HttpClient {
|
||||
Response call() throws ClientException;
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
package com.baeldung.javaslang.exception.handling.client;
|
||||
|
||||
public class Response {
|
||||
public final String id;
|
||||
|
||||
public Response(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,115 @@
|
|||
package com.baeldung.javaslang.exception.handling;
|
||||
|
||||
import com.baeldung.javaslang.exception.handling.client.ClientException;
|
||||
import com.baeldung.javaslang.exception.handling.client.HttpClient;
|
||||
import com.baeldung.javaslang.exception.handling.client.Response;
|
||||
import javaslang.collection.Stream;
|
||||
import javaslang.control.Option;
|
||||
import javaslang.control.Try;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static javaslang.API.Case;
|
||||
import static javaslang.API.Match;
|
||||
import static javaslang.Predicates.instanceOf;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class JavaslangTryTest {
|
||||
|
||||
@Test
|
||||
public void givenHttpClient_whenMakeACall_shouldReturnSuccess() {
|
||||
//given
|
||||
Integer defaultChainedResult = 1;
|
||||
String id = "a";
|
||||
HttpClient httpClient = () -> new Response(id);
|
||||
|
||||
//when
|
||||
Try<Response> response = new JavaslangTry(httpClient).getResponse();
|
||||
Integer chainedResult = response
|
||||
.map(this::actionThatTakesResponse)
|
||||
.getOrElse(defaultChainedResult);
|
||||
Stream<String> stream = response.toStream().map(it -> it.id);
|
||||
|
||||
//then
|
||||
assertTrue(!stream.isEmpty());
|
||||
assertTrue(response.isSuccess());
|
||||
response.onSuccess(r -> assertEquals(id, r.id));
|
||||
response.andThen(r -> assertEquals(id, r.id));
|
||||
assertNotEquals(defaultChainedResult, chainedResult);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenHttpClientFailure_whenMakeACall_shouldReturnFailure() {
|
||||
//given
|
||||
Integer defaultChainedResult = 1;
|
||||
HttpClient httpClient = () -> {
|
||||
throw new ClientException("problem");
|
||||
};
|
||||
|
||||
//when
|
||||
Try<Response> response = new JavaslangTry(httpClient).getResponse();
|
||||
Integer chainedResult = response
|
||||
.map(this::actionThatTakesResponse)
|
||||
.getOrElse(defaultChainedResult);
|
||||
Option<Response> optionalResponse = response.toOption();
|
||||
|
||||
//then
|
||||
assertTrue(optionalResponse.isEmpty());
|
||||
assertTrue(response.isFailure());
|
||||
response.onFailure(ex -> assertTrue(ex instanceof ClientException));
|
||||
assertEquals(defaultChainedResult, chainedResult);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenHttpClientThatFailure_whenMakeACall_shouldReturnFailureAndNotRecover() {
|
||||
//given
|
||||
Response defaultResponse = new Response("b");
|
||||
HttpClient httpClient = () -> {
|
||||
throw new RuntimeException("critical problem");
|
||||
};
|
||||
|
||||
//when
|
||||
Try<Response> recovered = new JavaslangTry(httpClient).getResponse()
|
||||
.recover(r -> Match(r).of(
|
||||
Case(instanceOf(ClientException.class), defaultResponse)
|
||||
));
|
||||
|
||||
//then
|
||||
assertTrue(recovered.isFailure());
|
||||
|
||||
// recovered.getOrElseThrow(throwable -> {
|
||||
// throw new RuntimeException(throwable);
|
||||
// });
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenHttpClientThatFailure_whenMakeACall_shouldReturnFailureAndRecover() {
|
||||
//given
|
||||
Response defaultResponse = new Response("b");
|
||||
HttpClient httpClient = () -> {
|
||||
throw new ClientException("non critical problem");
|
||||
};
|
||||
|
||||
//when
|
||||
Try<Response> recovered = new JavaslangTry(httpClient).getResponse()
|
||||
.recover(r -> Match(r).of(
|
||||
Case(instanceOf(ClientException.class), defaultResponse),
|
||||
Case(instanceOf(IllegalArgumentException.class), defaultResponse)
|
||||
));
|
||||
|
||||
//then
|
||||
assertTrue(recovered.isSuccess());
|
||||
}
|
||||
|
||||
|
||||
public int actionThatTakesResponse(Response response) {
|
||||
return response.id.hashCode();
|
||||
}
|
||||
|
||||
public int actionThatTakesTryResponse(Try<Response> response, int defaultTransformation){
|
||||
return response.transform(responses -> response.map(it -> it.id.hashCode()).getOrElse(defaultTransformation));
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue