Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Any samples to unit test fallback using Hystrix Spring Cloud

I wish to test the following scenarios:

  1. Set the hystrix.command.default.execution.isolation.thread.timeoutInMillisecond value to a low value, and see how my application behaves.
  2. Check my fallback method is called using Unit test.

Please can someone provide me with link to samples.

like image 848
Jerry Avatar asked Mar 13 '15 18:03

Jerry


2 Answers

A real usage can be found bellow. The key to enable Hystrix in the test class are these two annotations: @EnableCircuitBreaker @EnableAspectJAutoProxy

class ClipboardService {

    @HystrixCommand(fallbackMethod = "getNextClipboardFallback")
    public Task getNextClipboard(int numberOfTasks) {
        doYourExternalSystemCallHere....
    }

    public Task getNextClipboardFallback(int numberOfTasks) {
        return null;
    }
}


@RunWith(SpringRunner.class)
@EnableCircuitBreaker
@EnableAspectJAutoProxy
@TestPropertySource("classpath:test.properties")
@ContextConfiguration(classes = {ClipboardService.class})
public class ClipboardServiceIT {

    private MockRestServiceServer mockServer;

    @Autowired
    private ClipboardService clipboardService;

    @Before
    public void setUp() {
        this.mockServer = MockRestServiceServer.createServer(restTemplate);
    }

    @Test
    public void testGetNextClipboardWithBadRequest() {
        mockServer.expect(ExpectedCount.once(), requestTo("https://getDocument.com?task=1")).andExpect(method(HttpMethod.GET))
        .andRespond(MockRestResponseCreators.withStatus(HttpStatus.BAD_REQUEST));
        Task nextClipboard = clipboardService.getNextClipboard(1);
            assertNull(nextClipboard); // this should be answered by your fallBack method
        }
    }
like image 135
Razvan Juravle Avatar answered Sep 27 '22 23:09

Razvan Juravle


Fore open the circuit in your unit test case just before you call the client. Make sure fall back is called. You can have a constant returned from fallback or add some log statements. Reset the circuit.

@Test
public void testSendOrder_openCircuit() {
    String order = null;
    ServiceResponse response = null;

    order = loadFile("/order.json");
    // use this in case of feign hystrix
    ConfigurationManager.getConfigInstance()
            .setProperty("hystrix.command.default.circuitBreaker.forceOpen", "true");
   // use this in case of just hystrix
   System.setProperty("hystrix.command.default.circuitBreaker.forceOpen", "true");

    response = client.sendOrder(order);

    assertThat(response.getResultStatus()).isEqualTo("Fallback");
    // DONT forget to reset
    ConfigurationManager.getConfigInstance()
            .setProperty("hystrix.command.default.circuitBreaker.forceOpen", "false");
    // use this in case of just hystrix
    System.setProperty("hystrix.command.default.circuitBreaker.forceOpen", "false");

}
like image 34
Seetharamani Tmr Avatar answered Sep 27 '22 22:09

Seetharamani Tmr