【问题标题】:Mockito error with method POST,when using @Mock?使用@Mock时方法POST的Mockito错误?
【发布时间】:2016-01-12 06:02:58
【问题描述】:

我有一个类似于这个的简单带注释的控制器:

@RequestMapping(value = { "/search" }, method = RequestMethod.POST)
public String searchForm(@Valid Account account, ModelMap model, HttpServletRequest request) {
    //do something

    return "app";
}

我想用这样的单元测试来测试它:

private List<Account> listAccount = new ArrayList<Account>();
@Before
public void prepairUp() {

    // //// // ===============SETUP FOR MOCK========================
    MockitoAnnotations.initMocks(this);

    mockMvc = MockMvcBuilders.standaloneSetup(accountController).build();
}
@Test
public void tesControllerSearchForm() throws Exception {

    ModelMap modelMap = mock(ModelMap.class);

    Account account = mock(Account.class);
    HttpServletRequest request = mock(HttpServletRequest.class);
    final String review = accountController.searchForm(account, modelMap , request);

    when(accountService.findAllAccount()).thenReturn(listAccount);


    mockMvc.perform(MockMvcRequestBuilders.post("/search")).andExpect(MockMvcResultMatchers.status().isOk())
            .andExpect(MockMvcResultMatchers.model().attribute("listAccounts", listAccount))
            .andExpect(MockMvcResultMatchers.view().name(review));


}

它不起作用,不失败,不正确,错误行

final String review = accountController.searchForm(account, model, request);

【问题讨论】:

    标签: spring-mvc mockito junit4


    【解决方案1】:

    当您模拟控制器时,您必须手动设置通常由 spring 注入控制器的 bean。这就是在控制器中抛出 NullPointer 的原因。

    修改你的 prepairUp 如下:

    [Some Annotations you already have...]
    public class ControllerTest {
    
        @Inject
        private AccountService accountService;
    
        @PostConstruct
        public void prepairUp() {
    
            // //// // ===============SETUP FOR MOCK========================
            MockitoAnnotations.initMocks(this);
            AccountController accountController = new AccountController();
            ReflectionTestUtils.setField(accountController, "accountService", accountService);
            mockMvc = MockMvcBuilders.standaloneSetup(accountController).build();
        }
    
        @Test
        public void tesControllerSearchForm() {
            ...
        }
    
        ....
    }
    

    您只需要设置一次,因此只需将您的@Before 更改为@PostConstruct。

    【讨论】:

    • 我有`@InjectMocks private AccountController accountController; @Mock //@InjectMocks 私有 AccountService accountService; @Mock private AccountDao accountDao; @模拟私人账户;`
    • 没关系 - 但您也需要使用 ReflectionTestUtils 设置它们。当然你也需要模拟你的方法调用,否则会抛出下一个异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多