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

spring boot中的单元测试在服务中引发异常时出错

陶星波
2023-03-14

所以,我需要运行这个单元测试。

@MockBean
private AppServiceImpl appService;


@Test
public void shouldThrowExceptionWhenAppIdIsNull() throws Exception {
    File inputFile = this.getJsonFile();
    RequestDto requestDto = objectMapper.readValue(inputFile.getAbsoluteFile(),
            RequestDto.class);
    AppData appData = requestDto.getAppData();
    appData.setAppId(null);
    requestDto.setAppData(appData);
    when(appService.getUrl(requestDto, "header")).thenThrow(new RequestNotValidException());
    String payload = objectMapper.writeValueAsString(requestDto);
    this.mockMvc.perform(post(Base_URL + "app/requesturl")
            .contentType(contentType).content(payload).header(this.Header, "header"))
            .andExpect(status().is4xxClientError());
}

服务接口:

所以当我运行这个测试时,它会抛出一个异常,实际上不会在这里断言测试。

我在RequestNotValidException的顶部添加了@响应状态(HttpStatus.BAD_REQUEST),它扩展了RunTimeException

在第二个测试用例中,我得到了空的响应。我试过这个API vis Postman,得到了回复。那里一切正常。

@Test
public void getCardRegistration() throws Exception {
    File inputFile = this.getJsonFile();
    RequestDto requestDto = objectMapper.readValue(inputFile.getAbsoluteFile(), RequestDto.class);
    ResponseDto responseDto = new ResponseDto();
    responseDto.setURL(AuthUtils.randomStringToken(35));
    given(appService.getRegistrationUrl(requestDto, "header")).willReturn(responseDto);
    String payload = objectMapper.writeValueAsString(requestDto);
    MvcResult mvcResult = this.mockMvc.perform(post(Base_URL + "app/requesturl")
            .contentType(contentType).content(payload).header(this.Header, "header"))
            .andReturn();
    String contentAsString = mvcResult.getResponse().getContentAsString();
}

控制器内容:

    @Autowired
    IAppService appService;

    @RequestMapping(value = "/app/requesturl", method = RequestMethod.POST)
public ResponseDto getCardsRegistration(@RequestBody @Valid RequestDto requestDto, @RequestHeader(value="X-App-Name", required = true) String header) throws RequestNotValidException, JsonProcessingException {
    log.info("Request received in controller: "+ mapper.writeValueAsString(cardRegistrationRequestDto));
    log.info("Header value: "+ header);

    return this.appService.getRegistrationUrl(requestDto, header);
}

测试等级:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class AppRestControllerTest {

    protected String Base_URL = "/app";

    protected String Header = "X-App-Name";

    protected MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(),
            MediaType.APPLICATION_JSON.getSubtype(),
            Charset.forName("utf8"));

    @Autowired
    protected MockMvc mockMvc;

    protected ObjectMapper objectMapper = new ObjectMapper();

    @MockBean
    private AppServiceImpl appService;

    @Mock
    private AppRegistrationRepository appRegistrationRepository;


        @Before
    public void setUp() throws Exception {
        MapperFacade mapperFacade = new DefaultMapperFactory.Builder().build().getMapperFacade();
        appService = new AppServiceImpl(appRegistrationRepository, mapperFacade);
    }

我错过了什么?

共有1个答案

蒲魁
2023-03-14

尝试使用

@RunWith(SpringRunner.class)
@WebMvcTest(YourController.class)
public class AppRestControllerTest {

或者

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
public class AppRestControllerTest {

在你的测试中

 类似资料:
  • 问题 你想写个测试用例来准确的判断某个异常是否被抛出。 解决方案 对于异常的测试可使用 assertRaises() 方法。 例如,如果你想测试某个函数抛出了 ValueError 异常,像下面这样写: import unittest # A simple function to illustrate def parse_int(s): return int(s) class Test

  • 我遵循一个单元测试服务的教程,我试图使用JUnit5而不是JUnit4(这是教程使用的)。当我完全按照JUnit4的教程操作时,测试工作正常,但是我得到了JUnit5的NullPointerExc0019。 存储库: 服务: 测试: 以下是异常的前几行: 生成文件的测试和依赖项部分:

  • 我有一个方法: 这是用户授权测试的样子: 有没有办法检查用户输入错误密码的情况?因为在我发送错误密码的情况下,它不起作用,因为 使在你检查密码之前返回结果。

  • 我不熟悉单元测试。参考google之后,我创建了一个测试类来测试我的控制器,如下所示: 我有以下控制器和服务类: 当我调试单元测试时,控制器中的p对象为null。我的状态是200,但不是预期的JSON响应 我错过了什么?

  • 我不能对我的web服务的方法抛出异常。当我在我的方法中抛出异常并尝试从Soap UI测试我的应用程序时,会出现以下错误: 和 我的问题是: 如何为JavaWeb服务编写用户定义的异常? (例如,有一个方法返回一个学生的名字。但是,如果学生在数据库中找不到,会抛出一个错误?)

  • 问题内容: 在Python框架中,如果没有引发异常,是否有一种方法可以通过单元测试,否则会因AssertRaise而失败? 问题答案: 如果我正确理解了您的问题,则 可以 执行以下操作: …假设您有一个相应的测试,可以正确地针对无效输入进行测试,当然: 但是,正如评论中指出的那样,您需要考虑 实际 测试的内容。像…这样的测试可能 …更好,因为它测试系统所需的行为,如果一个异常失败 的 提高。