How to Unit Test Resilience4j circuit breaker fallback methods

Viewed 3270

I am trying to Unit test the Resilience4j CircuitBreaker configuration for my service. But I am unable to call the fallback method when I throw HttpServerErrorException. However I try to mock the objects the call is not going to the fallback method.

The fallback works fine. When AService fails, the call is directed to fallback method calling BService. How do I write test cases to verify them?

I am new to Resilience4j and fallback patterns. Please help me to test this.

Service class

@AllArgsConstructor
@Service
public class ServiceImpl implements Service {

    @NonNull
    private AService aService;

    @NonNull
    private BService bService;



    @CircuitBreaker(name = "resilienceConfig", fallbackMethod = "fallback")
    @TimeLimiter(name = "resilienceConfig")
    @Override
    public Mono<List<PojoClass>> method(Mono<PojoClass2> pc) {

        return pc
            .map(PojoClass2::getPojoClass2)
            .flatMapMany(Flux::fromIterable)
            .map(Pojo3::getId)
            .flatMap(service -> aService.method(param1, param2))
            .flatMapMany(Flux::fromIterable)
            .map(this::changeValues)
            .collectList();


    }

    public Mono<List<PojoClass>> fallback(Mono<PojoClass2> pc, Throwable ex) {
        return pc
            .map(PojoClass2::getPojoClass2)
            .flatMapMany(Flux::fromIterable)
            .map(Pojo3::getId)
            .flatMap(service -> bService.method(param1, param2))
            .flatMapMany(Flux::fromIterable)
            .map(this::changeValues)
            .collectList();
    }
}

ServiceTest

@SpringBootTest(classes = Application.class)
@RunWith(MockitoJUnitRunner.class)
public class ServiceImplTest {

    @Mock
    private AService aService;

    @Mock
    private BService bService;

    @InjectMocks
    ServiceImpl serviceImpl;

    @Test
    public void enrichException() {

    doThrow(new HttpServerErrorException(HttpStatus.INTERNAL_SERVER_ERROR))
            .when(aService)
            .method(param1, param2);
            
    Mono<List<PojoClass>> pojo = serviceImpl.method(param1);


    }
}
0 Answers
Related