Java 测试现场注入与构造函数注入
我尝试在控制器中用构造函数注入代替字段注入,因为这似乎是一种最佳实践。 当我运行应用程序时,它可以同时使用这两种解决方案 我的问题是控制器的单元测试。 我为使用字段注入的控制器编写测试类。 它很好用。 现在我用构造函数注入代替场注入。测试失败了 这是我的初始控制器(带现场注入): 现在,新控制器(带有构造函数注入): 和测试类:Java 测试现场注入与构造函数注入,java,unit-testing,spring-mvc,dependency-injection,mockito,Java,Unit Testing,Spring Mvc,Dependency Injection,Mockito,我尝试在控制器中用构造函数注入代替字段注入,因为这似乎是一种最佳实践。 当我运行应用程序时,它可以同时使用这两种解决方案 我的问题是控制器的单元测试。 我为使用字段注入的控制器编写测试类。 它很好用。 现在我用构造函数注入代替场注入。测试失败了 这是我的初始控制器(带现场注入): 现在,新控制器(带有构造函数注入): 和测试类: @RunWith(SpringRunner.class) @ContextConfiguration(classes = {MyApplication.class})
@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为null,测试失败
如果服务是构造函数注入的,mockito似乎不会对其进行模拟。
你知道我为什么会遇到这个问题,以及如何解决它吗?你需要将设置方法更改为以下内容:
@Before
public void setup() {
dashboardController = new DashboardController(myService);
mockMvc = MockMvcBuilders
.standaloneSetup(dashboardController)
.build();
}
您需要将设置方法更改为以下内容:
@Before
public void setup() {
dashboardController = new DashboardController(myService);
mockMvc = MockMvcBuilders
.standaloneSetup(dashboardController)
.build();
}
您是否尝试过在
MyService
上使用@MockBean
注释?并在仪表板控制器上使用简单的@Autowired
?并删除整个setup()
方法?您是否尝试在MyService
上使用@MockBean
注释?并在仪表板控制器上使用简单的@Autowired
?然后删除整个setup()
方法?谢谢,这很有效。我没想到要初始化控制器。谢谢,没问题。我没想到要初始化控制器。
@Before
public void setup() {
dashboardController = new DashboardController(myService);
mockMvc = MockMvcBuilders
.standaloneSetup(dashboardController)
.build();
}