3

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);


    }
}
Sam
  • 513
  • 1
  • 11
  • 27
  • Your test is just wrong. You are trying to use mockito runner with Spring Boot test. Which do you want a mockito based test or a spring boot test. If it is the latter remove the runner and use the `SpringRunner` and use `@MockBean` instead of `@Mock` and autowire the service instead of creating it. . – M. Deinum Aug 07 '20 at 09:23

0 Answers0