当前位置: 首页 > 知识库问答 >
问题:

未为模拟JPA运行Junit测试用例

弘志勇
2023-03-14

我已经编写了示例CRUD方法,我已经为服务组件编写了JUnit测试用例,但得到的结果是“地址id没有找到…”当我做测试的时候。

@test public void updateAddressTest()引发ResourceNotFoundException{

        Optional<Person> p = Optional.ofNullable(new Person( "Pranya", "Pune"));
        when(personRepository.existsById(1L)).thenReturn(true);
        
        
        Optional<Address> address = Optional.ofNullable(new Address( "zzz", "hyd","tel","1234"));
        
        when(repository.findById(1L)).thenReturn(address);
        
        Address addr1 = new Address( "zzz", "hyd","tel","1234");
        when(repository.save(addr1)).thenReturn(addr1);
        Address add= service.updateAddress(new Long(1L), new Long(1L),addr1);
        
        assertEquals(addr1,add );
    }





@Service
public class AddressService {

@Autowired
    private AddressRepository repository;
    
    @Autowired
    private PersonRepository personRepository;

public Address updateAddress(Long personId,
             Long addressId,Address addrRequest) throws ResourceNotFoundException {
        
         if (!personRepository.existsById(personId)) {
                throw new ResourceNotFoundException("personId not found");
            }

         return repository.findById(addressId).map(address -> {
                address.setCity(addrRequest.getCity());
                address.setState(addrRequest.getState());
                address.setStreet(addrRequest.getStreet());
                address.setPostalCode(addrRequest.getPostalCode());
                Person p = new Person();
                p.setId(personId);
                address.setPerson(p);
                
                return repository.save(address);
            }).orElseThrow(() -> new ResourceNotFoundException("address id not found.."));
    }
    
}

共有1个答案

裴泰平
2023-03-14

很可能repository.save(address)返回null。您正在嘲笑该方法,但仅针对参数equaladdr1。在AddressService中创建了一个不同的地址实例。我猜Address类没有实现equals方法(或者在实现中包含person字段),所以when(repository.save(addr1)).thenreturn(addr1)与调用不匹配,返回null

要解决此问题,请尝试使用mockito.doanswer而不是mockito.when:

Mockito.doAnswer(invocation -> invocation.getArguments()[0]).when(repo).save(Mockito.any(Address.class));

 类似资料:
  • 本节介绍与JUnit Framework相关的各种模拟测试。 您可以在本地计算机上下载这些示例模拟测试,并在方便时离线解决。 每个模拟测试都提供一个模拟测试密钥,让您自己验证最终得分和评分。 JUnit Mock Test I 问题1 - 以下哪项描述正确测试? A - 测试是检查应用程序功能的过程,是否按照要求运行。 B - 测试是单个实体(类或方法)的测试。 C - 以上两者。 D - 以上都

  • 从很久以前的某个版本开始(大约是1.b.35版),Nutz 就偷偷的加入了 maven 的 pom.xml 文件, 极好的解决了测试时需要依赖其他 jar 包的问题,接下来就让我们使用 Maven 来进行 JUnit 测试吧。 Nutz 在 Github 的 地址为 https://github.com/nutzam/nutz(Git@OSC镜像 https://git.oschina.net/n

  • 尝试为使用的演示者运行JUnit测试时,遇到RuntimeException。 由于它们是纯JUnit测试,而不是Android instrumentation测试,因此它们没有访问Android依赖项的权限,导致我在执行测试时遇到以下错误:

  • 问题内容: 我有一个Java命令行程序。我想创建JUnit测试用例以进行模拟。因为当我的程序运行时,它将进入while循环并等待用户输入。如何在JUnit中模拟呢? 问题答案: 从技术上讲,可以进行切换,但是总的来说,不直接在代码中调用它,而是添加一层间接层,这样输入源就可以从应用程序的某个位置进行控制,这样会更健壮。确切地讲,这是实现的详细信息-依赖项注入的建议很好,但是你不一定需要引入第三方框

  • 现在您已经了解了TestNG及其各种测试,您现在必须担心如何重构现有的JUnit代码。 没有必要担心,因为TestNG提供了一种按照自己的节奏从JUnit转换到TestNG的方法。 您可以使用TestNG执行现有的JUnit测试用例。 TestNG可以自动识别并运行JUnit测试,因此您可以将TestNG用作所有现有测试的运行器,并使用TestNG编写新测试。 您所要做的就是将JUnit库放在Te

  • 问题内容: 我在NetBeans 8.2中的一个新的干净Maven项目中创建了此测试: 如果我运行测试,日志显示 我的pom.xml包含以下依赖项: 是什么导致JUnit 5忽略测试方法? 更新:我添加了surefire插件,这是完整的pom.xml: 输出更改为: 并且surefire-reports文件夹包含两个“ .dump”文件。第一个内容: 问题答案: 确保将您的配置正确地设置为: 而且