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

当@PathVariable为字符串时,Spring controller测试失败,结果为404

禄源
2023-03-14
java.lang.AssertionError: Status 
Expected :200
Actual   :404
mockMvc.perform(get(ApplicationEndPoints.GET_CCS_NAME_AND_ADDRESS_AJAX, 1L, 2L))
       .andExpect(status().isOk());
@PreAuthorize("hasAuthority('auditor')")
@RequestMapping(value = ApplicationEndPoints.GET_APPLICANT_DATA, method = RequestMethod.GET)
@ResponseBody
public ApplicantData getNameAndAddress(@PathVariable("businessId") String businessId, @PathVariable("date") String date) {
    //Date d = Date.valueOf(date);
    ApplicantParams params = new ApplicantParams();
    //params.setBusinessId(businessId);
    //params.setApplicationReceivedDate(d);
    params.setRoleId(ADDRESS_ROLE.HR.getRoleId());
    return applicantService.getApplicantData(params);
 }

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ApplicationTestConfig.class})
@WebAppConfiguration
public class ClientDetailAjaxControllerTest {

    @InjectMocks
    private ClientDetailAjaxController clientDetailAjaxController;
    private MockMvc mockMvc;
    private ApplicantServiceInterface<Applicant> applicantService = Mockito.mock(ApplicantServiceImpl.class, Mockito.RETURNS_DEEP_STUBS);

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.standaloneSetup(clientDetailAjaxController).build();
    }


    @Test
    public void getNameAndAddress() throws Exception { 
        Mockito.when(applicantService.getApplicantData(Mockito.any(ApplicantParams.class)))
               .thenReturn(ApplicationTestData.getApplicantData());
        mockMvc.perform(get(ApplicationEndPoints.GET_APPLICANT_DATA, Mockito.anyString(), Mockito.anyString()))
               .andExpect(status().isOk());
        Mockito.verify(applicantService, Mockito.times(1)).getApplicantData(Mockito.any(ApplicantParams.class));
        Mockito.verifyNoMoreInteractions(applicantService);
    }

}

编辑:回复评论,我清理了一两件事……

共有1个答案

姚钊
2023-03-14

404告诉您mockMVC不能匹配您试图调用的控制器方法。

我注意到在控制器中,路径是applicationendpoints.get_applicant_data,而在测试中,路径是applicationendpoints.get_ccs_name_and_address_ajax

但是-不要使用mockito.anyString()来代替必须在mockMVCperform方法中提供给RequestBuilder参数值。

@RequestMapping(value = "/applicant/name-and-address/", method = RequestMethod.GET)
public ApplicantData getNameAndAddress(@PathVariable("businessId") String businessId, @PathVariable("date") String date) {
    // some code
 }

您需要执行以下操作:

mockMvc.perform(get("/applicant/name-and-address/{businessId}/{date}", "myBusinessId", "myDateAsString")).andExpect(status().isOk());

不同的是,您必须传递实际的字符串值,而不是mockito.anyString()。

其他一些注意事项:

 类似资料:
  • 我有以下班级档案 当我单独运行这个类时(作为- 控制台输出:[远程测试NG] 检测到测试NG版本 7.0.1 在端口 42250 上启动 Chrome 驱动程序 83.0.4103.39 (ccbf011cb2d2b19b506d833300373761342c20cd-refs/分支头/4103@{#416}) 仅允许本地连接。请参阅 https://chromedriver.chromium.

  • 问题内容: 在SQL 9(2005)中创建了一个存储过程,此后已升级到SQL 10(2008)。从那时起,以下存储过程停止工作并引发上述错误: 传入的参数@vPortalUID包含:2A66057D-F4E5-4E2B-B2F1-38C51A96D385。我执行这样的存储过程: 它跌倒了。我也尝试过转换。仍然没有喜悦。也具有将{}括起来的价值。我如上所述以编程方式和手动方式删除了这些内容。 如果您

  • 此代码未通过此标准的测试:给定一个字符串,计算以“y”或“z”结尾的单词数——因此“重”中的“y”和“fez”中的'z”计数,而不是“黄色”中的‘y’(不区分大小写)。如果一个单词后面没有一个字母,我们会说一个y或z在单词的末尾。(注意:Character.islet(char)测试char是否为字母。) 我用手跟踪它,但似乎不明白为什么它在许多测试中都不工作。例如,在“day fyyyz”中,它

  • 问题内容: 这是我的数据库的快照。 col1和col2都声明为int。 我的ComputedColumn当前添加列1和2,如下所示… 取而代之的是,我的ComputedColumn应该将列1和2(在中间包含 ’-‘ 字符)连接起来,如下所示… 那么,正确的语法是什么? 问题答案: 您可能将计算列定义为。试试吧。 或者,如果您愿意,可以替换为或选择其他长度。

  • 我已经设置了一个Jenkins服务器来运行Selenium测试。构建脚本是用Ant(CentOS 6.3上的V1.7.1)编写的,测试在Sauce实验室上运行。我通过shell执行构建:

  • 问题内容: 我有一个Android应用程序,我想检查安装的应用程序名称是否与传递给包含此代码的函数的字符串匹配。代码和示例如下: 假设您打过电话,并且手机上的应用程序名称与返回的名称相同。但是,它永远不会。我记录了结果,它应该匹配,但事实并非如此。任何人都可以请问我为什么这行不通吗? 问题答案: 使用String的equals()方法代替==运算符来比较字符串: 在Java中,新手遇到的最常见错误