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

SpringBoot单元测试-未调用服务方法

牛昱
2023-03-14

我不熟悉单元测试。参考google之后,我创建了一个测试类来测试我的控制器,如下所示:

@RunWith(SpringRunner.class)
@WebMvcTest(PromoController.class)
public class PromoApplicationTests {
    @Autowired
    protected MockMvc mvc;
    @MockBean PromoService promoService;
   
   
   protected String mapToJson(Object obj) throws Exception {
      ObjectMapper objectMapper = new ObjectMapper();
      return objectMapper.writeValueAsString(obj);
   }
   protected <T> T mapFromJson(String json, Class<T> clazz)
      throws JsonParseException, JsonMappingException, IOException {
      
      ObjectMapper objectMapper = new ObjectMapper();
      return objectMapper.readValue(json, clazz);
   }
   
   @Test
    public void applyPromotionTest_1() throws Exception {
           String uri = "/classPath/methodPath";
           List<Cart> cartLs = new ArrayList<Cart>();
          // added few objects to the list
           
           String inputJson = mapToJson(cartLs);
           MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(uri)
              .contentType(MediaType.APPLICATION_JSON).content(inputJson)).andReturn();
           
           int status = mvcResult.getResponse().getStatus();
           assertEquals(200, status);
           String actual = mvcResult.getResponse().getContentAsString();
           String expected = "{\"key1\":val1, \"key2\":\"val 2\"}";
           assertEquals(expected, actual, true);
            
    }
}

我有以下控制器和服务类:

@RequestMapping("/classPath")
@RestController
public class PromoController {
    @Autowired
    PromoService promoService;
    
    @PostMapping("/methodPath")
    public PromoResponse applyPromo(@RequestBody List<Cart> cartObj) {
        PromoResponse p = promoService.myMethod(cartObj);
        return p;
    }
}

@Component
public class PromoServiceImpl implements PromoService{

    @Override
    public PromoResponse myMethod(List<Cart> cartList) {
        // myCode
    }

}

当我调试单元测试时,控制器中的p对象为null。我的状态是200,但不是预期的JSON响应

我错过了什么?

共有1个答案

澹台聪
2023-03-14

使用@WebMvcTest时,spring boot只会初始化web层,不会加载完整的应用程序上下文。在使用@WebMvcTest时,需要使用@MockBean来创建和注入mock。

你已经做到了

 @MockBean 
 PromoService promoService;

Spring Boot仅实例化Web层而不是整个上下文

我们使用@MockBean为GreetingService创建并注入一个mock(如果不这样做,应用程序上下文将无法启动),并使用Mockito设置其期望值。

但是,由于它是mock bean,所以您负责模拟myMethod()调用

@Test
public void applyPromotionTest_1() throws Exception {
       String uri = "/classPath/methodPath";
       List<Cart> cartLs = new ArrayList<Cart>();
      // added few objects to the list

      // create PromoResponse object you like to return
      When(promoService.myMethod(ArgumentsMatchesr.anyList())).thenReturn(/*PromoResponse object */);
       
       String inputJson = mapToJson(cartLs);
       MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(uri)
          .contentType(MediaType.APPLICATION_JSON).content(inputJson)).andReturn();
       
       int status = mvcResult.getResponse().getStatus();
       assertEquals(200, status);
       String actual = mvcResult.getResponse().getContentAsString();
       String expected = "{\"key1\":val1, \"key2\":\"val 2\"}";
       assertEquals(expected, actual, true);
        
}
 类似资料:
  • 我正在进行一个spring-boot项目,其中我有一个控制器,它调用服务方法并处理输出。 我正在使用spring MockMvc测试web层。在我的测试类中,我用Mockito.when()模拟了服务方法。但是当我调用相应的处理方法时,它不是调用被模仿的服务方法,而是返回一个空响应。 控制器 测试类 返回的响应是 请帮我解决这个问题。提前谢谢!

  • 我已经开始考虑在我的项目中围绕一些业务逻辑添加一些单元测试。 我想测试的第一个方法是服务层中的一个方法,它返回给定节点的子节点列表。 该方法如下所示: 我想象这样的测试方法是提供一个假树结构,然后测试提供节点是否返回正确的子节点。 ssdsContext是一个对象上下文。 我已经看到可以为提取和接口如何模拟ObjectContext或ObjectQuery 我还读到,as Entity Frame

  • 本文向大家介绍AngularJS 单元测试服务,包括了AngularJS 单元测试服务的使用技巧和注意事项,需要的朋友参考一下 示例 服务编号 考试 跑!

  • 我正在尝试测试我的PreUpdateEventListener流,但我似乎无法使其在JUnit测试中工作。我没有收到任何错误,但没有调用代码。 我的PreUpdateEventListener: 测试: 我曾尝试将SessionFactory注入测试并调用SessionFactory#flush方法,但这不会引发CurrentContextSession错误,我似乎无法修复。

  • 需要对项目的控制器部分进行单元测试,但却得到了错误。我相信ModelAndVIew部分导致了这个问题,尽管我曾经嘲弄过它并返回ModelAndVIew,因为它是方法的返回类型。然而,它并不起作用。pom.xml没有任何问题,因此没有添加它。ProjectController: java.lang.IllegalStateException:找不到@SpringBootConfiguration,您

  • 我想测试我的SpringBoot应用程序,它使用cassandra作为CrudRepository。我最终得到了 具有 和 这就导致了 如果我使用旧版本的cassandra-unit-Spring 它以NullPointerException结束,因为没有注入值repo。 来源https://github.com/StephanPraetsch/spring.boot.cassandra.unit