JasonS
JasonS

Reputation: 455

Spring Cloud Stream - Mock Source always failed (without an existing MQ instance)

I have a RestController which has a @autowired Source attribute. I want to add some test cases of RestController. But it always fails, because the Source needs a real message broker.

So my question is: can i mock Source or is there a existing way to that? Or is my testing case code not correct? Thanks.

Code

Controller

@RestController
public class MyController {
    @Autowired
    private MySource mySource;

    @RequestMapping(path = "hello", consumes = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.POST)
    @ResponseBody
    public String process(@RequestBody Object body) {
        Message msg = new GenericMessage("");
        mySource.sendMessage(msg);

        return "success";
    }
}

Source

@EnableBinding(Source.class)
public class MySource {

    @Autowired
    @Output(Source.OUTPUT)
    private MessageChannel channel;

    public void sendMessage(Message msg) {
        channel.send(msg);
    }
}

test case

@RunWith(SpringRunner.class)
@WebMvcTest({MyController.class, MySource.class})
public class MyControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Mock
    private MySource mySource;

    @Test
    public void test() throws Exception {

        mySource = Mockito.mock(MySource.class);

        Message msg = new GenericMessage("");
        Mockito.doNothing().when(mySource).sendMessage(msg);

        ResultActions actions = mockMvc.perform(post("hello").contentType(MediaType.APPLICATION_JSON_VALUE).content("{}"));
        actions.andExpect(status().isOk()).andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8));
    }
}

Upvotes: 1

Views: 1521

Answers (1)

Ilayaperumal Gopinathan
Ilayaperumal Gopinathan

Reputation: 4179

If you are testing just the individual app, you can use TestSupportBinder from spring-cloud-stream-test-support. This section in the Spring Cloud Stream doc has some info on how to use it. You can also refer some of the unit test classes inside Spring Cloud Stream.

Upvotes: 1

Related Questions