【问题标题】:Spring mvc unit test controller inject dao object using mockitoSpring mvc单元测试控制器使用mockito注入dao对象
【发布时间】:2017-05-30 05:15:17
【问题描述】:

使用mockito对Spring mvc控制器进行单元测试时,如何注入dao层对象。使用 SpringJUnit4ClassRunner 类时,总是使用 @Spy 注释给出空指针异常。

示例代码:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:**/evivecare-application-context-test.xml" })
@WithMockUser(username = "admin", roles={"ADMIN"})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
public class ControllerTest {

    private MockMvc mockMvc;
     @Mock
     private SessionFactory sessionFactory;
     @Mock
     private Session session;
    @InjectMocks
    private FilterController filterController = new FilterController();
    @Spy
    private FilterService filterService= new FilterServiceImpl();
    @Autowired
    private FilterDAO filterDAO;
    @Mock
    private OperatorService userService;
    @Mock
    private EviveSpeechFilterService eviveSpeechFilterService;
    private TestContextManager testContextManager;



    @Before
    public void setup() throws Exception {
        // Process mock annotations
        MockitoAnnotations.initMocks(this);

        // Setup Spring test in standalone mode
        this.mockMvc = MockMvcBuilders.standaloneSetup(filterController).build();
        testContextManager = new TestContextManager(getClass());
        testContextManager.prepareTestInstance(this);

        filterDAO= new FilterDAOImpl(sessionFactory);
        Mockito.doReturn(session).when(sessionFactory).getCurrentSession();
    }

@Test
    public void testController200() throws Exception{
        Mockito.when(filterService.renameList("123","sdfgh")).thenReturn(false);
        Mockito.when(filterDAO.renameList("123","sdfgh")).thenReturn(false);
        this.mockMvc.perform(org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post("/renameList")
                .sessionAttr("filterService", filterService)
                .sessionAttr("filterDAO", filterDAO)
                .param("listId", "1234567")
                .param("alternateName", "LIst Name"))
        .andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.status().isOk());
    }
}

在这个测试用例中,filterService 依次调用filterDAO,它总是返回null pointer exception。 那么,我该如何解决这个问题呢?

【问题讨论】:

  • 请发布一些代码示例。另外,您为什么使用@Spy 而不是@Mock
  • @SergheyBishyr 请检查随附的代码

标签: spring-mvc junit mockito


【解决方案1】:

FilterService 不是托管 bean,您可能需要在构造函数中注入 dao,因为它不会在 filterService 中自动装配。

更多信息请参考这个问题:Support for autowiring in a class not instantiated by spring (3)

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 2019-07-07
    • 1970-01-01
    • 2011-08-12
    • 2021-03-15
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多