java - 使用 Spring 3.2 和 Mockito 进行 Controller 单元测试的上下文初始化问题

标签 java spring-mvc mockito

我正在尝试为我的 Controller 提供干净的单元测试。这个 Controller 有一个服务作为依赖,这个 Serviceh 有一个数据源作为依赖。

测试看起来像这样:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration
public class ContentActionWebServiceControllerTest {
  @Autowired
  private WebApplicationContext wac;

  private MockMvc mockMvc;

  @Autowired
  private MyService myService;

  @Test
  public void getRequestActionList() throws Exception {
    when(...)
    perform(...);
    verify(...);
  }

  @Configuration
  @ImportResource("...")
  static class MyTestConfiguration {

    @Bean
    public MyService myService() {
      return Mockito.mock(MyService.class);
    }
  }
}

MyService 类似于

@Service
public class MyService {
  @Autowired
  private MyDataSource myDatasource;

  ...
}

因为 MyService 作为 Autowired 属性 MyDataSource,上下文没有被初始化,因为它没有找到任何 MyDataSource 类型来满足 MyService 的 @Autowired 注释。但是为什么它会尝试解析这个注解呢?这是模拟吗?

最佳答案

Mockito 确实使用 cglib 创建一个新的 MyService 子类(并用模拟方法覆盖所有方法)。

但是,仍然会注入(inject)父级的依赖项,因为这是 Spring 的工作方式:

如果你有一个带有一些@Autowired字段的父类,以及一个从这个父类继承的子类,那么Spring会注入(inject)@Autowired字段实例化 child 时的 parent 。我想这与您的情况相同。

如果您使用MyService 的接口(interface),那么您的问题将得到解决。

关于java - 使用 Spring 3.2 和 Mockito 进行 Controller 单元测试的上下文初始化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15926494/

相关文章:

java - Spring Boot Controller 测试 - Mockito 当 thenReturn 列表不起作用时

java - 如何处理 doGet 或 doPost 中潜在的长时间操作?

java - 用于获取和设置的线程安全数据结构

java - 有没有办法在 ConstraintLayout 中复制组件的约束参数?

java - 试图弄清楚 CardLayout

java - Spring 。 "schemaLocation ... must have even number of URI' 秒”

java - Hibernate HQL 带有 Likes 的意外标记

java - Mockito/GWT : mocked view's widgets are null

java - 使用列表填充表时 JSP 中出现异常

java - 模拟父类(super class)方法调用