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

Mock JPA环境下JUnit测试用例执行报错:address id not found

解决"address id not found.."测试错误

看起来你的测试代码里有几个关键点没处理好,导致抛出了这个异常,我帮你一步步排查和修复:

1. 核心问题:Mockito未正确初始化Mock对象

你测试里的AddressRepository和PersonRepository如果没有被正确Mock并注入到AddressService中,Service会使用真实的Repository实例,而真实实例查询1L的ID自然找不到数据,就会抛出异常。

修复方法:完善测试类的Mockito配置

确保你的测试类加上Mockito的扩展/运行器注解,并用@Mock和@InjectMocks正确注入依赖:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class) // JUnit 5用这个,JUnit 4用@RunWith(MockitoJUnitRunner.class)
public class AddressServiceTest {

    @Mock
    private AddressRepository repository; // Mock地址仓库

    @Mock
    private PersonRepository personRepository; // Mock用户仓库

    @InjectMocks
    private AddressService service; // 自动将Mock注入到Service中

    @Test
    public void updateAddressTest() throws ResourceNotFoundException {
        // 测试逻辑...
    }
}

2. Mock的save方法匹配错误

你当前的测试里用when(repository.save(addr1)).thenReturn(addr1);,但业务代码中save的是从findById返回的那个address对象(不是你传入的addr1),所以这个Mock不会生效,虽然不是直接导致异常的原因,但会影响断言结果。

修复方法:用任意匹配器匹配Address对象

把save的Mock改成:

when(repository.save(any(Address.class))).thenReturn(address.get());

3. 可选优化:给测试用的Address设置ID

虽然不影响当前异常,但让测试数据更合理,创建Address时设置ID为1L(和你查询的ID一致):

Optional<Address> address = Optional.ofNullable(new Address(1L, "zzz", "hyd","tel","1234"));
Address addr1 = new Address(1L, "zzz", "hyd","tel","1234");

(如果你的Address类没有带ID的构造函数,可以用address.setId(1L)手动设置)

完整修复后的测试代码

@Test
public void updateAddressTest() throws ResourceNotFoundException {
    // 1. Mock Person存在的判断
    when(personRepository.existsById(1L)).thenReturn(true);

    // 2. 创建带ID的Address并Mock查询结果
    Address address = new Address(1L, "zzz", "hyd","tel","1234");
    when(repository.findById(1L)).thenReturn(Optional.of(address));

    // 3. Mock save操作,匹配任意Address对象
    when(repository.save(any(Address.class))).thenReturn(address);

    // 4. 构造请求参数
    Address addrRequest = new Address( "zzz", "hyd","tel","1234");

    // 5. 调用Service方法
    Address updatedAddress = service.updateAddress(1L, 1L, addrRequest);

    // 6. 断言结果
    assertEquals(address, updatedAddress);
}

这样修改后,你的测试应该就能正常运行,不会再抛出"address id not found.."的异常了。

内容的提问来源于stack exchange,提问作者user739115

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:02:47