首页 > 解决方案 > 使用 Mockito 测试时为空控制器

问题描述

我正在测试需要自动接线服务的控制器。

我在很多地方读过(例如Mockito: How to test my Service with mocking?)我需要这样做

@RunWith(JUnitPlatform.class)
public class AdminControllerTest {

  @Mock
  private AdminService service;

  @InjectMocks
  private AdminController adminController;

  @Test
  public void registerUser() {
    Boolean resultReal = adminController.registerUser();
    assertTrue(resultReal);
  }
}

但它失败了,我看到是因为 adminController 为空

相反,如果我这样创建控制器

AdminController adminController = new AdminController();

它有效,但我可以注入模拟。

也许我忘记了什么

标签: testingjunitmockingmockito

解决方案


根据InjectMocks 的文档

必须调用 MockitoAnnotations.openMocks(this) 方法来初始化带注释的对象。在上面的例子中,openMocks() 在测试基类的@Before (JUnit4) 方法中被调用。对于 JUnit3 openMocks() 可以转到基类的 setup() 方法。相反,您也可以将 openMocks() 放入您的 JUnit 运行器 (@RunWith) 或使用内置的 MockitoJUnitRunner。

因此,要么:

  1. 在测试运行之前调用openMocks(this)某处或
  2. @RunWith(MockitoJUnitRunner.class)在课堂上使用

推荐阅读