测试现场注入与构造函数注入



我尝试在控制器中用构造器注入代替场注入,因为这似乎是最佳实践。当我运行该应用程序时,它适用于这两种解决方案。

我的

问题是我的控制器的单元测试。我为使用字段注入的控制器编写测试类。它工作正常。现在我用结构器注射代替现场注射。测试失败。

这是我的初始控制器(带现场注入):

@Controller
public class DashboardController {
    @Autowired
    private MyService myService;
    @RequestMapping("/")
    public String index(Model model) {
        MyPojo myPojo = myService.getMyPojo();
        model.addAttribute("myPojo", myPojo);
        return "dashboard";
    }
}

现在新的控制器(带结构器注入):

@Controller
public class DashboardController {
    private final MyService myService;
    @Autowired
    public DashboardController(MyService myService) {
        this.myService = myService;
    }
    @RequestMapping("/")
    public String index(Model model) {
        MyPojo myPojo = myService.getMyPojo();
        model.addAttribute("myPojo", myPojo);
        return "dashboard";
    }
}

和测试类:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {MyApplication.class})
@WebAppConfiguration
@TestPropertySource(locations = "classpath:/application.properties")
public class DashboardControllerUnitTests {
    @InjectMocks
    private DashboardController dashboardController;
    @Mock
    private MyService myService;
    private MockMvc mockMvc;
    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders
                .standaloneSetup(dashboardController)
                .build();
    }
    @Test
    public void getDashboard() throws Exception {
        doReturn(new MyPojo()).when(myService).getMyPojo();
        mockMvc.perform(get("/"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(model().attribute("myPojo", equalTo(new MyPojo()))); // The test fail here
        verify(myService).getMyPojo();
    }
}

如果我使用控制器的初始版本运行测试,它工作正常。但是,如果我使用新版本的控制器(使用构造函数注入)运行相同的测试,myPojo 为空并且测试失败。

如果服务是注入构造函数,似乎 mockito 不会模拟服务。你知道为什么我有这个问题以及如何解决它吗?

您需要将设置方法更改为如下所示:

@Before
public void setup() {
    dashboardController = new DashboardController(myService);
    mockMvc = MockMvcBuilders
            .standaloneSetup(dashboardController)
            .build();
}

相关内容

  • 没有找到相关文章

最新更新