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

如何在@webmvctest中模拟服务层自动连线bean

慕容聪
2023-03-14

    @RestController
    @RequestMapping("/xxx")
    class TestController {

        private RetriveDataService retriveDataService;

        public TestControllerx(RetriveDataService retriveDataService) {
            this.retriveDataService = retriveDataService;
        }

        @PostMapping(value = "/yyy")
        public MyResponseModel myMethod(@RequestBody MyRequestModel model) {

            return retriveDataService.retriveData(model);
        }

    }

    @Service
    class RetriveDataService {

        private TokenService tokenService;

        public RetriveDataService(TokenService tokenService) {
            this.tokenService = tokenService;
        }

        public MyResponseModel retriveData(MyRequestModel model) {
            String accessToken = tokenService.getToken().getAccessToken();

            return retriveData(model, accessToken);
        }

    }

    @RunWith(SpringRunner.class)
    @WebMvcTest(TestController.class)
    public class TestControllerTest {

        @Autowired
        private MockMvc mvc;

        @Autowired
        private ObjectMapper objectMapper;

        @MockBean
        private RetriveDataService retriveDataService;

        @Test
        public void testRetriveData() throws Exception {

            mvc.perform(MockMvcRequestBuilders.post("/xxx/yyy").content(objectMapper.writeValueAsString(new MyRequestModel()))
                    .contentType(MediaType.APPLICATION_JSON_UTF8)).andDo(MockMvcResultHandlers.print())
                    .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8));
        }

    }

当我运行这个测试时,我会得到以下输出(如果我的服务不需要另一个bean,我会得到预期的输出)

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = []
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

由于这个响应,我在line.andExpect(content().contentType(Mediatype.application_json_utf8));上遇到了问题。当我检查response body时(因为body也是空的)

再现问题的示例项目在这里

共有1个答案

傅砚
2023-03-14

检查您的存储库,确认了问题评论中讨论的假设。

在模拟上指定期望

MyModel requestMessage = new MyModel();
requestMessage.setMessage("Hello Request Post");
given(testService1.getMessage(requestMessage)).willReturn(responseMessage);

@webmvctest中的控制器中接收到的消息不等于测试中指定的requestMessage。这是由于MyModel类不重写equals方法。在这种情况下,Mockito将使用其默认行为:

    null

有关选项2的更多信息:

从技术上讲,你的预期相当于:

given(testService1.getMessage(ArgumentMatchers.eq(requestMessage)))
  .willReturn(responseMessage);

您可以使用其他匹配器,甚至可以定义自己的匹配器。如果您不能修改参数类型的代码(类型来自第三方库等),这将非常有用。例如,可以使用argumentmatchers.any(MyModel.Class))

 类似资料:
  • 我想实例化OrderAbstraction服务,它需要在测试用例的构造函数中使用实体管理器。 我尝试自动连接OrderAbstractionTest,并将OrderAbstraction和实体管理器作为参数。 my service.yaml,autowire设置为true 我一直收到这样的东西: PHP致命错误:Uncaught ArgumentCounter错误:函数App\Test\Order

  • 我想知道是否有办法模拟正在自动连线的场。 考虑下面的情况。 我有一个班级名A 另一个B类看起来像这样 现在我想为这个方法编写junit。 我知道有一种方法可以像这样模拟自动连线场。 但我的问题是- eg 请提出建议,否则就没有办法了???? 我不想改变私人生活。我也不想添加getter和setter或reflection。我只是想知道,在创建一个类的新对象之后,有没有办法模拟B实例。

  • 我有一个类。并且我已经编写了一个类的单元测试方法的类。我的代码如下:- 在我的单元测试课上,我编写了以下方法。 当我执行测试类,我得到错误。这是因为在类中,在方法的第8行中,学生机构映射字段为null。这只发生在模拟对象上。如何获得模拟对象的自动生成字段?

  • 我有一个 Rest Controller 类,其中我正在自动布线服务层。现在我想模拟测试类中的服务层,但在运行我的测试类 控制器代码 测试类 我是JUnit5和Mockito的新手。有人能告诉我哪里错了吗?

  • 我读了很多关于如何模拟Spring的bean和它们的自动连线场的文章。但我找不到任何关于豆子的autowired列表。 具体问题 我想测试一下这门课。但我找不到模拟属性的方法。 我所尝试的 由于是单例,我尝试模拟这些bean的几个实例,希望它们能够反映在中,但没有成功。 然后,我尝试创建一个列表,该列表被注释为。通过手动启动,我希望注入创建的列表。这仍然没有成功。 在中抛出了一个NPE,我认为这会

  • 问题内容: 如果Service类使用Validated注释进行注释,则同一类无法自动装配自身。 这是在Spring Context尝试加载时引发的异常: 同样,当您有很多依赖于类的自身时,就会发生这种情况(当某个服务使用使用第一个服务的其他服务时)。我想知道@Validated注解,但是我总是在bean上遇到同样的错误。 有人知道我该怎么解决吗? 问题答案: 在这种情况下,注释与错误的自动装配无关