Java 通过设置私有字段,Spring单元测试Rest控制器
我有一个简单的Rest控制器,如下所示Java 通过设置私有字段,Spring单元测试Rest控制器,java,spring-boot,unit-testing,junit,mockito,Java,Spring Boot,Unit Testing,Junit,Mockito,我有一个简单的Rest控制器,如下所示 @RestController public class HealthController { private static final CustomLogger logger = CustomLogger.getLogger(HealthController.class.getName()); private HealthService healthService; @Autowired
@RestController
public class HealthController {
private static final CustomLogger logger = CustomLogger.getLogger(HealthController.class.getName());
private HealthService healthService;
@Autowired
public HealthController(HealthService healthService) {
this.healthService = healthService;
}
@RequestMapping(value = "/health", method = RequestMethod.GET)
public ResponseEntity<?> healthCheck() {
return healthService.checkHealth();
}
}
我遇到的问题是我的CustomLogger
。由于它具有外部依赖性,我在尝试测试时遇到了问题。我的服务类中也存在相同类型的记录器。
我如何测试这样一个类。我试过下面的东西
- 在测试中创建了自定义类名
。使用CustomLoggerForTest
ReflectionTestUtils.setField(healthService,“logger”,新的CustomerLoggerForTest(healthService.class.getName())代码> 在
。但这没有帮助。使用此选项,我们无法设置静态字段,因此甚至尝试将其转换为非静态字段设置中
- 在
中模拟setup
尝试如下CustomLogger
mockStatic(CustomLogger.class);when(CustomLogger.getLogger(any())。然后return(new CustomLoggerForTest(HealthController.class.getName())代码> 但是没有运气。
是否有任何我做错了的事情导致了这一切
@Service
public class HealthService {
private static final CustomLogger logger = CustomLogger.getLogger(HealthController.class.getName());
public ResponseEntity<?> checkHealth() {
logger.info("Inside Health");
if (validateHealth()) {
return new ResponseEntity<>("Healthy", HttpStatus.OK);
} else {
return new ResponseEntity<>("Un Healthy", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
boolean validateHealth() {
return true;
}
}
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HealthController.class)
public class HealthControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private HealthService healthService;
@Test
public void checkHealthReturn200WhenHealthy() throws Exception {
ResponseEntity mockSuccessResponse = new ResponseEntity("Healthy", HttpStatus.OK);
when(healthService.checkHealth()).thenReturn(mockSuccessResponse);
RequestBuilder requestBuilder = MockMvcRequestBuilders.get(
"/health").accept(
MediaType.APPLICATION_JSON);
MvcResult healthCheckResult = mockMvc
.perform(requestBuilder).andReturn();
Assert.assertEquals(HttpStatus.OK.value(), healthCheckResult.getResponse().getStatus());
}
}