【问题标题】:Context initialization issue for controller Unit testing with Spring 3.2 and Mockito使用 Spring 3.2 和 Mockito 进行控制器单元测试的上下文初始化问题
【发布时间】:2013-04-10 12:56:32
【问题描述】:

我正在尝试为我的控制器提供一个干净的单元测试。这个 Controller 有一个 Service 作为依赖,这个 Serviceh 有一个 Datasource 作为依赖。

测试看起来像这样:

@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,上下文没有被初始化,因为它没有找到任何满足 MyService 的 @Autowired 注解的 MyDataSource 类型。但是为什么它会尝试解决这个注释呢?这是模拟吗?

【问题讨论】:

  • 能否将堆栈跟踪添加到您的问题中?它可能会帮助人们回答。谢谢。

标签: java spring-mvc mockito


【解决方案1】:

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

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

如果你有一个包含一些@Autowired 字段的父类,以及一个从该父类继承的子类,那么Spring 将在实例化子时注入父类的@Autowired 字段。我猜你的情况是一样的。

如果你使用MyService的接口,那么你的问题就迎刃而解了。

【讨论】:

  • 确实,那是我的错误。 MyService 现在是一个接口并且可以工作。谢谢你的解释。
  • 正如 kryger 所说,我建议你注释 setter 而不是私有成员,这样你就可以在没有依赖注入的情况下对你的类进行单元测试。只需创建模拟并使用设置器将它们注入测试对象。单元测试根本不应该使用依赖注入。
【解决方案2】:

如果它应该是一个单元测试(而不是一个集成测试),你甚至不需要使用 Spring,你可以使用 JUnit+Mockito 来完成。您可以简单地创建支持对象的模拟(通过@Mock)并将它们注入到被测试者(通过@InjectMocks),而不是@Autowireing 来自Spring 上下文的依赖项。我相信您的代码可以简化为(从概念上)如下:

@RunWith(MockitoJUnitRunner.class)
public class ContentActionWebServiceControllerTest {

  @Mock
  private Service mockServiceUsedByController;

  @InjectMocks
  private YourController testee;

  @Test
  public void getRequestActionList() throws Exception {
    assertFalse(testee.getRequestActionList().isEmpty());
    // etc.
  }
}

【讨论】:

    猜你喜欢
    • 2019-07-07
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    相关资源
    最近更新 更多