使用 Mockito 在 REST 控制器中模拟类

Sma*_*ajl 2 java testing junit mockito spring-boot

我有一个 spring-boot 应用程序,它通过控制器公开一个 REST 接口。这是我的控制器的一个例子:

@RestController
public class Controller {

  @Autowired
  private Processor processor;

  @RequestMapping("/magic")
  public void handleRequest() {

    // process the POST request
    processor.process();

  }   
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试为这个类编写单元测试,我必须模拟处理器(因为处理需要很长时间,我试图在测试控制器行为期间避免这一步)。请注意,为了这个问题,提供的示例已简化。

我正在尝试使用 mockito 框架来完成这项任务:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = App.class)
@WebAppConfiguration
@ActiveProfiles("test")
public class ControllerTest {

  @Autowired
  private WebApplicationContext wac;

  private MockMvc mockMvc;

  @Before
  public void setUp() throws Exception {

    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();

    Processor processor = Mockito.mock(Processor.class);
    ReflectionTestUtils.setField(Controller.class, "processor", processor);
  }

  @Test
  public void testControllerEmptyBody() throws Exception {

    this.mockMvc.perform(post("/magic")).andExpect(status().isOk());

  }
}
Run Code Online (Sandbox Code Playgroud)

然而,这失败了

java.lang.IllegalArgumentException: Could not find field [processor] of type [null] on target [class org.company.Controller]
    at org.springframework.test.util.ReflectionTestUtils.setField(ReflectionTestUtils.java:112)
    ...
Run Code Online (Sandbox Code Playgroud)

请有人给我一个提示,这个模拟如何注入我的控制器?

Jon*_*han 5

你不应该传递一个实例来设置字段,而不是类,例如:

...

@Autowired
private Controller controller;

...

@Before
public void setUp() throws Exception {

    ...

    Processor processor = Mockito.mock(Processor.class);
    ReflectionTestUtils.setField(controller, "processor", processor);
}
Run Code Online (Sandbox Code Playgroud)