直接从Controller而不是MockMvc从服务层模拟方法

时间:2019-11-24 12:47:14

标签: controller mockmvc

想象一下,我有: 1 /我的RestController

@RestController
@RequestMapping("/v2/lists/")
public class ListController {

@Resource
MyService myService;

@GetMapping("/mock/test")
public ResponseEntity<String> touche() {

    System.out.println(myService.action());
    return new ResponseEntity<String>("ok", HttpStatus.ACCEPTED);
}

2 /我的服务层

@Service
public class MyService {

public String action() {
    return "==> origin (not mocked)";
}
}

3 /我的测试班

@SpringBootTest
@RunWith(SpringRunner.class)
public class SCRIntegrationTest {

@Autowired
private ListController listController;

@Autowired
public WebApplicationContext wac;

@Mock
private MyService myService;

public MockMvc mockMvc;

@PostConstruct
private void init() {
    DefaultMockMvcBuilder builder = MockMvcBuilders.webAppContextSetup(this.wac)
            .alwaysDo(MockMvcResultHandlers.print());
    this.mockMvc = builder.build();

    MockitoAnnotations.initMocks(this);
    Mockito.when(myService.action()).thenReturn("==> mocké");
    ReflectionTestUtils.setField(listController, "myService", myService);
}

@Test
public void testIfServiceMocked() throws Exception {

    ResultMatcher ok = MockMvcResultMatchers.status().isOk();
    MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/v2/lists/mock/test");

    MvcResult mvcResult = this.mockMvc.perform(builder).andExpect(ok).andReturn();
}

==>好吧,一切都很好。当测试询问端点时,我的方法myService.action()得到了很好的模拟。 现在,我想直接模拟Controller中的方法 这样....

1 /我的(新)RestController

@RestController
@RequestMapping("/v2/lists/")
public class ListController {

@GetMapping("/mock/test")
public ResponseEntity<String> touche() {

public String action() {
    return "==> origin (not mocked)";
}

@GetMapping("/mock/test")
public ResponseEntity<String> touche() {

    System.out.println(action());
    return new ResponseEntity<String>("ok", HttpStatus.ACCEPTED);
}

2 /我的(新)测试班

@SpringBootTest
@RunWith(SpringRunner.class)
public class SCRIntegrationTest {

@Autowired
public WebApplicationContext wac;

@Mock
private ListController mock;

public MockMvc mockMvc;

@PostConstruct
private void init() {
    DefaultMockMvcBuilder builder = MockMvcBuilders.webAppContextSetup(this.wac)
            .alwaysDo(MockMvcResultHandlers.print());
    this.mockMvc = builder.build();

    MockitoAnnotations.initMocks(this);
    Mockito.when(mock.action()).thenReturn("==> mocké");
}

@Test
public void testIfServiceMocked() throws Exception {

    ResultMatcher ok = MockMvcResultMatchers.status().isOk();
    MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/v2/lists/mock/test");

    MvcResult mvcResult = this.mockMvc.perform(builder).andExpect(ok).andReturn();
}

==>是否可以直接从控制器(ListController)模拟方法操作? 我写了行代码

@Mock
private ListController mock;

和行

Mockito.when(mock.action()).thenReturn("==> mocké");

,但似乎不起作用。 预先感谢。

0 个答案:

没有答案