【发布时间】:2021-05-06 15:00:47
【问题描述】:
我有一个类 Service 调用单例类的方法。我想模拟一个 saveContract 方法调用。
public class Service {
public Contract save(Contract contract) {
Contract result;
...
result = ContractDao.getInstance().saveContract(contract);
...
return result;
}
}
我这样修改了 Service 类(添加了一个字段和一个构造函数,仅用于测试目的):
public class Service {
private final ContractDao contractDao;
public Service() {
this(ContractDao.getInstance());
}
public Service(final ContractDao contractDao) {
this.contractDao = contractDao;
}
public Contract save(Contract contract) {...}
}
我的测试课是:
@ExtendWith(MockitoExtension.class)
class ServiceTest {
@Mock
ContractDAO contractDaoMock;
private Service service;
@BeforeEach
public void setup() {
service = new Service(contractDaoMock);
}
@Test
void saveContractTest() {
Contract changedContract = new Contract(...);
when(contractDaoMock.saveContract(any())).thenReturn(changedContract);
Contract givenContract = new Contract(...);
Contract actualContract = service.save(givenContract);
//Assertions
...
}
}
【问题讨论】:
-
这能回答你的问题吗? Mocking static methods with Mockito
-
没有。我没有理由使用 PowerMockito。我按照这里的描述做了:Mocking a singleton with mockito
-
不,你没有。你从来没有嘲笑过
ContractDao.getInstance() -
什么意思?
-
@ChrisCross
result = ContractDao.getInstance().saveContract(Contract contract);正在调用您的测试。因此,您应该更改Service的实现并使用初始化的ContractDAO字段,或者您应该模拟ContractDao.getInstance()
标签: java junit mockito singleton