Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 21 additions & 19 deletions kotlin/src/main/java/feign/kotlin/CoroutineFeign.java
Original file line number Diff line number Diff line change
Expand Up @@ -163,25 +163,27 @@ public <T> T target(Target<T> target, C context) {
@Override
@SuppressWarnings("unchecked")
public CoroutineFeign<C> internalBuild() {
AsyncFeign<C> asyncFeign =
(AsyncFeign<C>)
AsyncFeign.builder()
.logLevel(logLevel)
.client((AsyncClient<Object>) client)
.decoder(decoder)
.errorDecoder(errorDecoder)
.contract(contract)
.retryer(retryer)
.logger(logger)
.encoder(encoder)
.queryMapEncoder(queryMapEncoder)
.options(options)
.requestInterceptors(requestInterceptors)
.responseInterceptors(responseInterceptors)
.invocationHandlerFactory(invocationHandlerFactory)
.defaultContextSupplier((AsyncContextSupplier<Object>) defaultContextSupplier)
.methodInfoResolver(methodInfoResolver)
.build();
AsyncFeign.AsyncBuilder<Object> asyncBuilder =
AsyncFeign.builder()
.logLevel(logLevel)
.client((AsyncClient<Object>) client)
.decoder(decoder)
.errorDecoder(errorDecoder)
.contract(contract)
.retryer(retryer)
.logger(logger)
.encoder(encoder)
.queryMapEncoder(queryMapEncoder)
.options(options)
.requestInterceptors(requestInterceptors)
.responseInterceptors(responseInterceptors)
.invocationHandlerFactory(invocationHandlerFactory)
.defaultContextSupplier((AsyncContextSupplier<Object>) defaultContextSupplier)
.methodInfoResolver(methodInfoResolver);
if (dismiss404) {
asyncBuilder.dismiss404();
}
AsyncFeign<C> asyncFeign = (AsyncFeign<C>) asyncBuilder.build();
return new CoroutineFeign<>(asyncFeign);
}
}
Expand Down
26 changes: 26 additions & 0 deletions kotlin/src/test/kotlin/feign/kotlin/CoroutineFeignTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import org.assertj.core.api.Assertions.assertThat
import org.junit.Test
import java.io.IOException
import java.lang.reflect.Type
import java.util.concurrent.atomic.AtomicBoolean

class CoroutineFeignTest {
@Test
Expand Down Expand Up @@ -105,6 +106,31 @@ class CoroutineFeignTest {
assertThat(firstOrder).isEqualTo(Unit)
}

@Test
fun `sut should dismiss 404 responses when dismiss404 is configured on CoroutineBuilder`(): Unit = runBlocking {
// Arrange: server returns 404; a custom decoder records whether it was invoked
val server = MockWebServer()
server.enqueue(MockResponse().setResponseCode(404))

val decoderInvokedFor404 = AtomicBoolean(false)
val recordingDecoder = Decoder { response, _ ->
decoderInvokedFor404.set(response.status() == 404)
""
}

val client = TestInterfaceAsyncBuilder()
.dismiss404()
.decoder(recordingDecoder)
.target("http://localhost:" + server.port)

// Act: must not throw FeignException; the decoder must be invoked for the 404
val result: String = client.findOrderThatReturningBasicType(orderId = 1)

// Assert
assertThat(decoderInvokedFor404.get()).isTrue()
assertThat(result).isEqualTo("")
}

@Test
fun `sut should run correctly when using http body`(): Unit = runBlocking {
// Arrange
Expand Down