【问题标题】:Getting a null pointer when testing a controller using MockMvc使用 MockMvc 测试控制器时获取空指针
【发布时间】:2020-02-19 16:07:11
【问题描述】:

在对控制器进行单元测试时,我得到一个空指针。调用模拟服务以获取 id 时,控制器中出现空指针。我尝试了很多东西,但仍然遇到同样的错误。

下面是出现空指针的控制器代码中的 sn-p:

@RestController
@RequestMapping(ELEMENTS_BASE_URI)
@EnableCommonRestHeaders
public class ElementController {
    @Autowired
    private ElementService elementService;
...
public ResponseEntity<ElementDto> createElement(
            @Valid @RequestBody ElementDto elementDto) {

        ElementDto saved = elementService.createElement(elementDto);

        HttpHeaders headers = new HttpHeaders();

        URI location = UriBuilder.builder(ELEMENT_LINK_URI)
                .pathVariable(ELEMENT_ID, saved.getId())
                .create();
        headers.setLocation(location);

        return new ResponseEntity<>(saved, headers, HttpStatus.CREATED);
    }
...

}

在上面的控制器代码中,空指针出现在下面一行: 保存为空

   ElementDto saved = elementService.createElement(elementDto);

测试代码如下:

import static com.sas.fcs.networkbuild.util.matchers.JSONContentResultMatcher.jsonObject;
import static com.sas.fcs.networkbuild.util.matchers.JSONContentResultMatcher.jsonPath;

@RunWith(SpringJUnit4ClassRunner.class)
@WebMvcTest(controllers = ElementController.class, excludeAutoConfiguration = MockMvcSecurityAutoConfiguration.class)
@ActiveProfiles(value = {"test", "hsql", "disable-oauth2"})
@TestPropertySource("classpath:/test.properties")
public class ElementControllerTest {


    @MockBean
    private ElementService elementService;

    @Autowired
    ElementController elementController;

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper mapper;

    @Before
    public void setUp() {
        mockMvc = MockMvcBuilders
                .standaloneSetup(elementController)
                .build();
    }

    @Test
    public void testCreateElementSuccess() throws Exception {
        ElementDto element = new ElementDto();
        element.setName("firstname");
        element.setModifiedTimeStamp(new Date());

        ElementDto createdElement = new ElementDto();
        String elementId = "123";
        createdElement.setId(elementId);
        createdElement.setName("firstname");
        createdElement.setLabel("firstname");
        createdElement.setAttribute(true);
        createdElement.setKeep(true);


        when(elementService.create(element)).thenReturn(createdElement);

        // make sure returns location with new element id
        mockMvc.perform(
                post(ServiceConstants.ELEMENTS_BASE_URI)
                     .content(mapper.writeValueAsBytes(element))
                     .accept(ElementDto.MEDIA_TYPE_JSON_VALUE)
                     .contentType(ElementDto.MEDIA_TYPE_JSON_VALUE))
                     .andExpect(status().isCreated())
                     .andExpect(header().string("Location",
                        Matchers.endsWith(ServiceConstants.SERVICE_URI + ServiceConstants.ELEMENTS_BASE_URI + "/" + elementId)))
                     .andExpect(header().string("Last-Modified", not(isEmptyString())))
                     .andExpect(jsonObject().is(createdElement))
                     .andExpect(jsonPath("name").value(element.getName()))
                     .andReturn();
    }
}

行:

when(elementService.create(element)).thenReturn(createdElement);

似乎没有任何效果。非常感谢您对此的任何帮助。

问候, 费拉斯

【问题讨论】:

  • 因为您的测试中的ElementDto 和控制器中的ElementDto 不会是同一个实例。我怀疑你想使用:when(elementService.create(Mockito.any())).thenReturn(createdElement);
  • @AlanHay,我用这一行替换了它:when(elementService.create(Mockito.any())).thenReturn(createdElement);我仍然遇到同样的错误。谢谢。
  • 我也尝试了以下,但仍然是同样的问题:when(elementService.create(Mockito.any(ElementDto.class))).thenReturn(createdElement);
  • 实际上为null的是什么,服务还是创建的项目?您的模拟注释看起来不对。有关示例,请参见此处:stackoverflow.com/questions/16170572/…
  • @AlanHay 正如我在问题中提到的,null 发生在这一行: ElementDto saved = elementService.createElement(elementDto);保存为空。不知道你的意思是我的嘲笑符号是错误的。它们是标准的测试注释。

标签: spring-boot spring-mvc mockito


【解决方案1】:

这个问题的原因是我犯了一个错误。该函数是 createElement,并且 when/any 引用了 create 函数。

我变了:

when(elementService.create(eq(element))).thenReturn(createdElement);

到:

when(elementService.createElement(eq(element))).thenReturn(createdElement);

其余的代码和符号都是正确的。

【讨论】:

    猜你喜欢
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多