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
相关产品推荐
相关产品推荐

