gpt4 book ai didi

java - 测试字段注入(inject) VS 构造函数注入(inject)

转载 作者:行者123 更新时间:2023-12-02 02:30:27 25 4
gpt4 key购买 nike

我尝试在 Controller 中用构造函数注入(inject)替换字段注入(inject),因为这似乎是最佳实践。当我运行该应用程序时,它适用于这两种解决方案。

我的问题是 Controller 的单元测试。我为使用字段注入(inject)的 Controller 编写测试类。效果很好。现在我用构造函数注入(inject)代替字段注入(inject)。测试失败。

这是我的初始 Controller (带有字段注入(inject)):

@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 (带有构造函数注入(inject)):

@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();
}

}

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

如果服务是构造函数注入(inject)的,mockito 似乎不会模拟该服务。您知道为什么我会遇到这个问题以及如何解决它吗?

最佳答案

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

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

关于java - 测试字段注入(inject) VS 构造函数注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47203169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com