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