如何测试包含storeInDb()方法的服务类并编写对应HttpStatus.OK与HttpStatus.BAD_REQUEST场景的JUnit测试用例
解决方案:JUnit测试用例覆盖storeInDb方法的所有场景
没问题,我来帮你编写覆盖这个storeInDb方法所有分支的JUnit测试用例。我们会用Mockito来Mock依赖的Validator类,这样就能独立测试storeInDb的逻辑分支,不用依赖Validator的实际实现。
测试思路
我们需要覆盖三个核心场景:
- 验证通过,返回
HttpStatus.OK和传入的数据库模型 - 验证失败(无效凭据),返回
HttpStatus.BAD_REQUEST和"Invalid Credentials"消息 - 验证失败(域名不存在),返回
HttpStatus.BAD_REQUEST和"Domain does not exist."消息
测试代码实现
首先确保你的项目已经引入了必要的测试依赖(比如Spring Boot Test、Mockito),然后编写如下测试类:
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import java.util.HashMap; import java.util.Map; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; public class YourServiceClassTest { // 替换成你的实际服务类名 @Mock private Validator validator; // Mock依赖的Validator类 @InjectMocks private YourServiceClass service; // 注入被测试的服务类实例 private ExeEntity testModel; @BeforeEach void setUp() { MockitoAnnotations.openMocks(this); // 初始化测试用的ExeEntity实例 testModel = new ExeEntity(); testModel.setLink("test-link"); testModel.setUsername("test-user"); testModel.setPassword("test-pass"); testModel.setSolution("test-solution"); testModel.setDomain("test-domain"); } @Test void storeInDb_WhenValidationSucceeds_ReturnsOkWithModel() { // 1. 准备Mock数据:Validator返回包含"Success"的Map Map<String, String> validResponse = new HashMap<>(); validResponse.put("Success", "Validation passed"); when(validator.validateInput(testModel.getLink(), testModel.getUsername(), testModel.getPassword(), testModel.getSolution(), testModel.getDomain())) .thenReturn(validResponse); // 2. 调用被测试方法 ResponseEntity response = service.storeInDb(testModel); // 3. 验证结果 assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(testModel, response.getBody()); } @Test void storeInDb_WhenInvalidCredentials_ReturnsBadRequestWithMessage() { // 1. 准备Mock数据:Validator返回包含"Fail"和"Invalid Credentials"的Map Map<String, String> invalidCredsResponse = new HashMap<>(); invalidCredsResponse.put("Fail", "Invalid Credentials"); when(validator.validateInput(testModel.getLink(), testModel.getUsername(), testModel.getPassword(), testModel.getSolution(), testModel.getDomain())) .thenReturn(invalidCredsResponse); // 2. 调用被测试方法 ResponseEntity response = service.storeInDb(testModel); // 3. 验证结果 assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); assertEquals("Invalid Credentials", response.getBody()); } @Test void storeInDb_WhenDomainDoesNotExist_ReturnsBadRequestWithMessage() { // 1. 准备Mock数据:Validator返回既不含"Success"也不含"Fail"的Map Map<String, String> domainNotFoundResponse = new HashMap<>(); domainNotFoundResponse.put("Error", "Domain issue"); // 随便一个非Success/Fail的键 when(validator.validateInput(testModel.getLink(), testModel.getUsername(), testModel.getPassword(), testModel.getSolution(), testModel.getDomain())) .thenReturn(domainNotFoundResponse); // 2. 调用被测试方法 ResponseEntity response = service.storeInDb(testModel); // 3. 验证结果 assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); assertEquals("Domain does not exist.", response.getBody()); } }
代码说明
- @Mock:用来创建
Validator的Mock实例,这样我们可以控制它的返回值,模拟不同的验证结果。 - @InjectMocks:自动将Mock的
Validator注入到被测试的服务类中,避免依赖真实的Validator实现。 - setUp方法:在每个测试用例前初始化测试数据和Mock环境,保证测试的独立性。
- 每个测试用例都遵循准备-执行-验证的模式:先设置Mock的返回值,然后调用被测试方法,最后验证返回的状态码和响应体是否符合预期。
这样就能完整覆盖storeInDb方法的所有分支逻辑啦!
内容的提问来源于stack exchange,提问作者Bhavya
相关产品推荐
相关产品推荐

