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

Spring控制器试验随机失败

吕琪
2023-03-14

有一个项目大约有20个控制器。每个控制器都有其相应的测试类。当我们尝试添加新的controller tests类时,以前运行良好的一些测试开始随机失败。如果使用@Ignore注释任何控制器测试类,测试将恢复正常。

这是失败测试抛出的异常:

org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常为java.lang.IllegalStateException:org.springframework.web.context.support.genericwebapplicationcontext@22f3fadf已经关闭。

::弹簧引导::(V2.0.3.发行版)

2019-07-04T13:01:50,325 INFO[pool-1-thread-17]O.S.B.StartupInfologger:在valhala上用PID 17817启动ZipCodeControllerTest(由/home/wblanck/projects/project中的wblanck启动)2019-04T13:01:50,325 DEBUG[pool-1-thread-17]O.S.B.StartupInfologger:用Spring Boot V2.0.3运行。发行版,Spring V5.0.7。发行版2019-07-04T13:01:50,325上下文层次结构根目录2019-07-04T13:01:50,448 INFO[pool-1-thread-17]O.S.B.F.A.AutoWireDanNotationBeanPostProcessor:找到并支持自动连接的JSR-330“javax.inject.inject”注释

2019-04T13:01:50,772信息[pool-1-thread-17]O.S.W.S.H.AbstractHandlerMethodMapping$MappingRegistry:映射“{[/error]}”到公共组织.SpringFramework.http.ResponseEntity com.package.Controller.WrongPatherRorController.BadPatherRor(javax.servlet.httpServletRequest)2019-07-04T13:01:50,772信息[pool-1-thread-17]O.S.W.S.H.

...其他HandlerMethodMappings...

测试很相似,基本上共同的结构是:


@RunWith(SpringRunner.class)
@WebMvcTest(Controller.class)
public class ControllerTest {

    private static final String URL_TEMPLATE = ".....";

    @Autowired
    private MockMvc mvc;

    @Autowired
    private ObjectMapper mapper;

    @MockBean
    private Service service;

    private CustomParams params;
    private CustomRequest request;

    @Before
    public void init() {
        // initialize params and request ...
    }

    @Test
    public void methodOk() throws Exception {
        when(service.method(refEq(params))).thenReturn(RESPONSE);

        mvc.perform(MockMvcRequestBuilders.post(URL_TEMPLATE)
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content(mapper.writeValueAsString(request)))
                .andExpect(status().isOk())
                .andExpect(jsonPath(STATUS_MESSAGE_PATH, is(MESSAGE_CODE_OK)))
                .andExpect(jsonPath(STATUS_CODE_PATH, is(STATUS_OK.getStatusCode()))));
    }


    @Test
    public void badRequest() throws Exception {
        mvc.perform(MockMvcRequestBuilders.post(URL_TEMPLATE))
                .andExpect(status().isBadRequest())
                .andExpect(jsonPath(ERROR_MESSAGE_PATH).isNotEmpty());
    }

控制器具有如下结构:

@RestController
public class Controller {

    private Service service;

    @PostMapping(value = "/api/some-url", produces = {"application/json"})
    public ResponseEntity<CustomResponse> method(
            @RequestHeader("someheaders") Integer someHeaders,
            @RequestBody CustomRequest someBody) {

        CustomParams params = new CustomParams();
        params.setApplicationType(applicationType);
        params.someHeaders(someHeaders);

        return service.method(params);
    }


出于保密的考虑,我已经更改了类和变量的名称。

共有1个答案

孙宏扬
2023-03-14

您应该在测试中使用DirtiesContext注释。这将确保您在每个测试中都获得干净的上下文,并且它们不会相互干扰

 类似资料:
  • 我对@RestController和Spring Boot应用程序有问题 我对GET映射有问题 第一个endpoint@GetMap("/export")起作用,第二个不起作用;t起作用。在后一个endpoint中,无论我返回什么。在这里我测试了“Hello”,但它无论如何都不起作用。有趣的是,当我将第一个“导出”的路径更改为其他任何内容时,它也停止工作任何想法?

  • 我想验证请求参数。我已经浏览了很多博客并回答了问题,我也做了同样的事情。在控制器类上添加了@Validated。 控制器中的方法: 控制器建议 配置: 完成所有这些之后,现在我得到一个404错误。"状态":404,"错误":"未找到","消息":"没有可用的消息"

  • 环境:Mac OS X Lion, PHP 5.3.10, MySQL 5.X,TYPO3 4.7.1,Extbase 4.7.1,流体4.7.0 几天来,我一直在纠结extbase中的一个奇怪的验证错误。 Tx_Foo_Controller_FeUserController包含以下两个操作: 和 两项行动的内容: 登记册。html具有以下形式: createAction中只有一些“OK”文本。

  • 我从两个方面建议了一些方法,一个是使用spring AOP支持,另一个是()建议所有带有注释的方法。在我的单元测试中,我试图通过破坏方法契约来强制抛出错误,但有时验证是到位的(上面提到的后处理器强加的建议),有时不起作用。有人经历过类似的事情吗。 下面是我正在尝试做的事情的一个小片段: 注释(可记录代码) 使用@Validated注释注释的接口(这里有相关信息的链接)。 实现此接口的基类:公共抽象

  • 尝试用junit5和mockito测试我的web层(spring boot、spring mvc)。http方法的所有其他测试(get、put等)工作正常,但更新。遵循代码。 控制器: 服务: 最后,测试: 结果: CustomerService中的update(...)方法返回为null。无法理解方式。请建议。

  • 我试图使用mockmvcbuilders.standalonesetup方法为一个spring mvc rest控制器创建一个非常基本的单元测试。我一直收到一个404错误。下面列出了测试应用程序上下文、测试类、控制器和整个堆栈跟踪。欢迎任何指导。 java.lang.AssertionError:状态应为:<200>但实际为:<404>在org.springframework.test.util.