【问题标题】:Service method not called in controller控制器中未调用服务方法
【发布时间】:2019-10-07 13:43:31
【问题描述】:

我的控制器类:

package some.pkg.controller;

@RestController
@RequestMapping(value="/api", produces="application/json")
public class MyController {

    @Autowired
    private IntSequenceFilter sequenceFilter;

    @PostMapping("/odd")
    public FilteredSequence filterOdd(@RequestBody SequenceRequest sequenceRequest) {
        List<Integer> filteredSequence = sequenceFilter.process(sequenceRequest.getData());
        return new FilteredSequence(filteredSequence);
    }
}

我的服务等级:

package some.pkg.service;

@Service
public class IntSequenceFilter {
    // ... Some code ... 
}

这是我的测试:

package some.pkg.controller    

@RunWith(SpringJUnit4ClassRunner.class)
@WebMvcTest(MyController.class)
public class MyControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private IntSequenceFilter sequenceFilter;

    @Test
    public void testFilter() throws Exception {
        MvcResult response = mockMvc.perform(
                MockMvcRequestBuilders.post("/api/odd")
                        .content("{\"data\":\"1;2;3;-1;-2;-3\"}")
                        .contentType(MediaType.APPLICATION_JSON_UTF8)
                        .accept(MediaType.APPLICATION_JSON)
        )
                .andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
                .andReturn();

        // ... Some assertions ...
    }
}

当我运行测试时,sequenceFilter.process() 不会在控制器的 filterOdd 方法中调用。有人可以帮我弄清楚这里出了什么问题吗?

【问题讨论】:

    标签: java spring junit


    【解决方案1】:

    我相信您是在说 sequenceFilter.process() 不会通过检查 process() 方法中的日志语句来调用。

    这是一个Mock,你需要模拟如下行为

      Mockito.when (sequenceFilter.process (Mockito.any ())).thenReturn (sequences);
    

    如果要调用实际的服务实现,请使用Spy

    替换

    @MockBean
    private IntSequenceFilter sequenceFilter;
    

    @SpyBean
    private IntSequenceFilter sequenceFilter;
    

    【讨论】:

      【解决方案2】:

      请尝试添加以下设置方法,因为它使用模拟设置控制器。

      @InjectMocks
      private MyController myController;
      
      @Before
      public void setup() {
          MockitoAnnotations.initMocks(this);
          this.setMockMvc(MockMvcBuilders.standaloneSetup(myController).build());
          // set return values from the mocked service
          when(sequenceFilter.process(...).thenReturn(...);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 2017-05-08
        • 2011-08-05
        • 1970-01-01
        • 2014-05-02
        相关资源
        最近更新 更多