不可能用DAO mock编写集成测试控制器?

时间:2018-03-01 09:37:03

标签: java spring-boot spring-test spring-restcontroller springmockito

我变得疯狂,我尝试了各种测试跑步者和可能的注释的所有可能组合进行测试,我需要的最近解决方案如下:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {MyApplication.class})
@WebAppConfiguration
public class MyControllerTest {

    MockMvc mockMvc;

    // My DAO is an interface extending JpaRepository
    @Mock
    MyDAO myDAO;

    @Autowired
    WebApplicationContext webApplicationContext;

    @Before
    public void setUp() throws Exception {
        List<MyItem> myItems = new ArrayList(){{
            // Items init ...
        }}
        Mockito.when(myDAO.findAll()).thenReturn(myItems);
        /* Other solution I tried with different annotations: 
        * given(myDAO.findAll()).willReturn(myItems);
        * this.mockMvc = MockMvcBuilders.standaloneSetup(myController).build();
        */
        this.mockMvc = webAppContextSetup(webApplicationContext).build();

    }

    @After
    public void tearDown() throws Exception {
//        Mockito.reset(myDAO);
    }

    @Test
    public void getItems() {
        String res = mockMvc.perform(get("/items"))/*.andExpect(status().isOk())*/.andReturn().getResponse().getContentAsString();
        assertThat(res, is("TODO : string representation of myItems ..."));
        assertNull(res); // For checking change in test functionning
    }
}

我很好地在我的控制器方法中进入调试模式,在服务方法中但是当我看到DAO类型时,它不是模拟并且findAll()总是返回空的ArrayList(),即使我这样做:

Mockito.when(myDAO.findAll()).thenReturn(myItems);

我没有异常提出,我的DAO没有被嘲笑,我不知道怎么办,尽管我找到了所有tuto。 我发现的最接近的tuto是Unit Test Controllers with Spring MVC Test但是没有用,因为他想要将模拟服务注入控制器以便测试控制器,我的魔杖模拟DAO注入到注入控制器的实际服务中(我想测试控制器) +服务)。

在我看来,我已经通过在测试类上使用注释来实现这一点,该注释指定了在测试模式下Spring应用程序必须实例化哪个类以及必须要模拟哪个类但我不记得'-_ -

需要你的帮助,这让我很吵!

非常感谢!!!

2 个答案:

答案 0 :(得分:1)

对于@Mock注释,您需要进行额外的初始化:

    @Before
    public void initMocks() {
        MockitoAnnotations.initMocks(this);
    }

或者将跑步者更改为@RunWith(MockitoJUnitRunner...,但在这种情况下不确定弹簧上下文初始化。

答案 1 :(得分:0)

我终于做到了(但不满意,因为它不会模拟HSQLDB DataBase,它会创建一个测试版),而我想模拟DAO:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {MySpringApplication.class})
@WebAppConfiguration
public myTestClass {
    MockMvc mockMvc;

    @Autowired
    ItemDAO itemDAO;

    @Autowired
    WebApplicationContext webApplicationContext;

    @Before
    public void setUp() throws Exception {
        this.mockMvc = webAppContextSetup(webApplicationContext).build();
    }

    @After
    public void tearDown() throws Exception {
        itemDAO.deleteAll();
    }

    @Test
    public void testMethod() {
        // DB init by saving objects: create a item and save it via DAO, use real test DB

        // Only mocking about rest call:
        String res = mockMvc.perform(get("/items")).andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
    }

}