【问题标题】:Testing @ModelAttribute method on a controller在控制器上测试 @ModelAttribute 方法
【发布时间】:2014-02-13 20:46:01
【问题描述】:

这是控制器中的注释方法:

@RequestMapping(method = RequestMethod.GET)
public String getClient(@PathVariable("contractUuid") UUID contractUuid, Model model) {
    ClientDto clientDto = new ClientDto();
    clientDto.setContractUuid(contractUuid);
    model.addAttribute("client", clientDto);
    return "addClient";
}

@ModelAttribute("contract")
public ContractDto getContract(@PathVariable("contractUuid") UUID contractUuid) throws ContractNotFoundException {
    return contractService.fromEntity(contractService.findByUuid(contractUuid));
}

我正在尝试的测试方法如下所示,但属性 contract 失败。 client 属性在 @RequestMapping 方法中添加到 Model

private MockMvc mockMvc;
@Autowired
private ContractService contractServiceMock;
@Autowired
private ClientService clientServiceMock;
@Autowired
protected WebApplicationContext wac;

@Before
public void setup() {
    Mockito.reset(contractServiceMock);
    Mockito.reset(clientServiceMock);
    this.mockMvc = webAppContextSetup(this.wac).build();
}

@Test
public void test() throws Exception {
    UUID uuid = UUID.randomUUID();
    Contract contract = new Contract(uuid);

    when(contractServiceMock.findByUuid(uuid)).thenReturn(contract);

    mockMvc.perform(get("/addClient/{contractUuid}", uuid))
            .andExpect(status().isOk())
            .andExpect(view().name("addClient"))
            .andExpect(forwardedUrl("/WEB-INF/pages/addClient.jsp"))
            .andExpect(model().attributeExists("client"))
            .andExpect(model().attributeExists("contract"));
}

contract 属性在我运行应用程序时显示在 jsp 页面中,因为我使用了它的一些属性,但由于它在测试方法中失败,是否有另一种方法来测试它? 它失败并显示以下消息:

java.lang.AssertionError: 模型属性“合同”不存在

Spring 是 4.0.1.RELEASE

【问题讨论】:

  • 你也可以发布@RequestMapping方法吗?
  • 你正在测试 addClient,表明
  • @NimChimpsky 你想让我展示 addCLient 的测试类吗?
  • 你正在测试的 URL 是 addClient...
  • 是的,但该 URL 的模型还必须具有从 @ModeAttribute 方法检索到的协定属性。

标签: spring spring-mvc junit mockito spring-test


【解决方案1】:

看来是我的错。 尽管 @ModelAttribute 方法返回了一个 ContractDto 的实例,但我只模拟了服务中使用的一种方法:

when(contractServiceMock.findByUuid(uuid)).thenReturn(contract);

所以 findByUuid 返回了一些东西,但 contractService.fromEntity 没有被触及,所以我也不得不模拟它:

UUID uuid = UUID.randomUUID();
    Contract contract = new Contract(uuid);
    ContractDto contractDto = new ContractDto(uuid);

    when(contractServiceMock.findByUuid(uuid)).thenReturn(contract);
    when(contractServiceMock.fromEntity(contract)).thenReturn(contractDto);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多