当前位置: 首页 > 知识库问答 >
问题:

REST控制器内带有Mockito的Mock类

楚泳
2023-03-14

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

@RestController
public class Controller {

  @Autowired
  private Processor processor;

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

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

  }   
}

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

@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());

  }
}
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)
    ...

共有1个答案

云承天
2023-03-14

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

...

@Autowired
private Controller controller;

...

@Before
public void setUp() throws Exception {

    ...

    Processor processor = Mockito.mock(Processor.class);
    ReflectionTestUtils.setField(controller, "processor", processor);
}
 类似资料:
  • 我有一个Springboot应用程序,它在运行时根据用户传递的输入参数从中查找bean。对于这种方法,我试图编写Mockito测试用例,但它不起作用,并抛出NullPointerException。 引导应用程序的类: 我试图为其编写测试用例的类: 我的测试用例如下: 每当我运行测试用例时,它都会在

  • 问题内容: 我有一个控制器,该控制器的操作可以显示一组特色产品。但是,产品是通过包含专有模型和视图的控制器进行管理的。 如何从控制器中的操作中访问信息?实例化无法运行,因为该类未在运行时加载,并且CodeIgniter也未提供动态加载控制器的方法。将类放入库文件中实际上也不起作用。 确切地说,我需要在索引视图中插入产品视图(填充有控制器处理的数据)。我正在运行CodeIgniter 2.0.2。

  • 问题内容: 我正在用Swift开发iOS应用程序。 我想使用prepareForSegue函数将数据从视图发送到另一个视图。 但是,我的目标视图之前是导航控制器,因此它不起作用。 请问我该怎么做? 问题答案: 在访问目标导航控制器,然后在其顶部: 您可以从目标控制器访问其视图并传递数据。 在旧版本(现在已过时)的Swift和UIKit版本中,代码略有不同:

  • easySwoole支持REST风格开发。在实现上,其实是对AbstractController进行了REST规则封装,本质上,也是一个控制器。 支持GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS。 实例代码 namespace AppControllerRest; use CoreAbstractInterfaceAbstractREST; use CoreHttp

  • Rest 控制器是什幺? Rest 控制器是 Base 控制器的扩充并内建支援 RESTful。 这能让你轻鬆建立 API。 请注意: 如果你在你的 REST 控制器使用 before() 或 router 方法, 你 必须 呼叫父层方法 parent::before()(或路由)以保持正常运作。 使用 Rest 控制器 如同所有的控制器,你在 fuel/app/classes/controlle

  • 我正在使用Spring Boot、Spring Data REST、Spring HATEOAS、Hibernate、JPA。 我在应用程序中广泛使用Spring Data REST,并公开了实体的所有存储库。不幸的是,有些特殊的情况并不是那么容易管理的。其中之一是: 我有一个自定义控制器: 这里的问题是,覆盖这些endpoint时,我隐藏了Spring Data REST创建的/searchen