Java 为什么Mockito调用real方法?

Java 为什么Mockito调用real方法?,java,junit,mockito,singleton,Java,Junit,Mockito,Singleton,我有一个调用singleton类方法的类服务。我想模拟一个saveContract方法调用 公共类服务{ 公共合同保存(合同){ 合同结果; ... 结果=ContractDao.getInstance().saveContract(合同); ... 返回结果; } } 我这样修改了服务类(添加了一个字段和一个构造函数,仅用于测试目的): 公共类服务{ 私人最终合同; 公共服务(){ 这个(ContractDao.getInstance()); } 公共服务(最终合同){ this.contr

我有一个调用singleton类方法的类服务。我想模拟一个saveContract方法调用

公共类服务{
公共合同保存(合同){
合同结果;
...
结果=ContractDao.getInstance().saveContract(合同);
...
返回结果;
}
}
我这样修改了服务类(添加了一个字段和一个构造函数,仅用于测试目的):

公共类服务{
私人最终合同;
公共服务(){
这个(ContractDao.getInstance());
}
公共服务(最终合同){
this.contractDao=contractDao;
}
公共合同保存(合同合同){…}
}
我的测试课程是:

@ExtendWith(MockitoExtension.class)
类服务测试{
@嘲弄
ContractDAO contractDaoMock;
私人服务;
@之前
公共作废设置(){
服务=新服务(模拟);
}
@试验
void saveContractTest(){
合同变更合同=新合同(…);
当(contractDaoMock.saveContract(any())。然后返回(changedContract);
合同授予合同=新合同(…);
合同实际合同=服务.save(给定合同);
//断言
...
}
}

添加
mockitoinline
依赖项,并使用
MockedStatic
模拟
getInstance()
方法

您的代码应该如下所示:

@测试
void saveContractTest(){
合同变更合同=新合同(…);
try(MockedStatic mockedContractDAO=mockStatic(ContractDAO.class){
mockedContractDAO.when(ContractDAO::getInstance)。然后返回(contractDaoMock);
当(contractDaoMock.saveContract(any())。然后返回(changedContract);
合同授予合同=新合同(…);
合同实际合同=服务.save(给定合同);
//断言
...
}
}
查看此处的文档,了解有关模拟静态方法的更多信息:

Service.save()中,我没有替换该行

result = ContractDao.getInstance().saveContract(contract);
用线

result = contractDao.saveContract(contract);

所以,我们需要使用一个我们模拟过的字段实例,而不是singleton.getInstance()。

这回答了你的问题吗?不。我没有理由使用PowerMockito。我按照这里描述的那样做:不,你没有。你从来没有模拟过
ContractDao.getInstance()
你是什么意思?@ChrisCross
result=ContractDao.getInstance().saveContract(契约契约);
正在调用您的测试。因此您应该更改
服务的实现,并使用初始化的
ContractDAO
字段,或者您应该模拟
ContractDAO.getInstance()
我没有注意到,犯了那个错误。谢谢您的时间,但我找到了正确的解决方案。请发布一个答案,这样我们就可以帮助其他人解决同样的问题了!:)