You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 09:12:31