我尝试在控制器中用构造器注入代替场注入,因为这似乎是最佳实践。当我运行该应用程序时,它适用于这两种解决方案。
我的问题是我的控制器的单元测试。我为使用字段注入的控制器编写测试类。它工作正常。现在我用结构器注射代替现场注射。测试失败。
这是我的初始控制器(带现场注入):
@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();
}