【发布时间】:2021-04-03 09:23:55
【问题描述】:
我是 JUnit 和 Mockitio 的新手。当我运行下面的代码时,我得到, java.lang.NullPointerException:无法调用“org.springframework.http.ResponseEntity.getStatusCodeValue()”,因为“com.learnit.testing.MyController.getUser(java.lang.Long)”的返回值为 null
@Controller
@RequestMapping("/api")
public class MyController {
@Autowired
private MyService service;
@GetMapping("/")
@ResponseBody
public ResponseEntity<Object> getUser(Long id) throws Exception {
return service.myResponse(id);
}
}
@Service
public class MyService {
@Autowired
private MyRepository repository;
public ResponseEntity<Object> myResponse(Long id) throws Exception{
MyData data=repository.findById(id).orElse(null);
if(data!=null)
return new ResponseEntity<>(HttpStatus.OK);
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
测试
@ExtendWith(MockitoExtension.class)
public class MyTest {
@InjectMocks
private MyController controller;
@Mock
private MyRepository repo;
@Mock
private MyService service;
@Test
public void checkService() throws Exception {
when(repo.findById((long)1)).thenReturn(null);
assertEquals(controller.getUser((long)1).getStatusCodeValue(), 500);
}
}
【问题讨论】:
-
请注意,我认为让服务返回
ResponseEntity是非常糟糕的风格。我建议让服务返回一个Optional<MyData>并让控制器将其转换为ResponseEntity,具体取决于它是否为空 (404) 或不 (OK)。
标签: java spring-boot junit mockito