1

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));
    }
}
JasonS
  • 445
  • 1
  • 5
  • 17

1 Answers1

1

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.

Ilayaperumal Gopinathan
  • 4,099
  • 1
  • 13
  • 12