当前位置: 首页 > 知识库问答 >
问题:

Springmvc单元测试控制器使用mockito注入道对象

姬泰
2023-03-14

当使用mockito单元测试Spring mvc控制器时,如何注入道层对象。当使用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,它总是返回空指针异常。那么,我能做些什么来解决这个问题呢?


共有1个答案

哈雅珺
2023-03-14

FilterService不是托管bean,您可能需要在构造函数中注入道,因为它不会在FilterService中自动运行。

请参考SO上的这个问题以了解更多信息:支持非spring实例化的类中的自动连接(3)

 类似资料:
  • 我对使用Spring控制器进行单元测试的概念是新的。我正在遵循我在网上找到的一些示例,并尝试实现他们的测试策略。这是我的基本控制器: 这是我的单元测试: 看起来很简单,但我得到了以下错误: 它完成了这项工作,但它没有像我之前尝试的那样使用任何Spring注释…这种方法是不好的,所以试图弄清楚为什么每当我在测试文件中包含注释时,总是会出现错误。 我的POM:

  • 问题内容: 对于我一生,我无法让$ httpBackend在执行$ http get请求的控制器上工作。我已经尝试了几个小时=) 我将其简化为下面可以最简单的形式。如果我通过测试 在控制器中注释掉$ http.get()请求 在测试中注释掉“ httpMock.flush()” 并更改“猪”和“狗”以匹配 也就是说,这是一个有效的工作测试和应用程序。 如果放回去,则会在底部显示错误。 app /

  • 本文向大家介绍AngularJS 单元测试控制器,包括了AngularJS 单元测试控制器的使用技巧和注意事项,需要的朋友参考一下 示例 控制器代码: 考试: 跑!

  • 问题内容: 编辑:本文末尾的“快速与肮脏”解决方案 我使用的是AngularUI-Bootstrap中的模式窗口,其方式与网站上说明的相同,只是我分割了文件。因此,我有: CallingController.js: modalController.js: 当我使用Karma测试此代码(在karma配置文件中加载了 ui-bootstrap-tpls.min.js 文件)时,出现以下错误: 错误:[

  • 问题内容: 初始化JavaFX运行时的正确方法是什么,以便您可以对使用并发工具和的控制器进行单元测试(使用JUnit)? 从该方法调用会导致死锁。如果未调用,则会引发以下错误: 后续:这是我根据@SergeyGrinev的建议一直使用的主题。 问题答案: 调用由是正确的做法。请注意,这不会将控制权返回给调用代码。因此,您必须将其包装到中。 7年后的更新: 使用TestFX!它将以适当的方式进行启动

  • 问题内容: 我有一个与此类似的简单带注释的控制器: 我想用这样的单元测试来测试它: 问题是AnnotationMethodHandlerAdapter.handler()方法引发异常: 问题答案: 从Spring 3.2开始,有一种适当的方法可以轻松,优雅地进行测试。您将可以执行以下操作: 有关更多信息,请访问http://blog.springsource.org/2012/11/12/spri