我有一个方法,其中包含 transactionTemplate。我的测试在运行调试模式时有效,但在直接执行时无效。
我的测试在运行调试模式时有效,因为我认为事务操作是在调试模式下完成的。但当我刚运行时,它就出错了。我该如何克服这个问题?
这是我的方法:
@Override
public void saveAndUpdate(DataDictionaryDTO input) {
try {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
DataDictionaryEntity ent = null;
if (NullUtils.isNotNullOrZero(input.getId())) {
ent = dataDictionaryRepository.findById(input.getId()).orElse(null);
}
dataDictionaryRepository.save(dataDictionaryDTOMapper.map(input, ent));
}
});
}
catch (DataIntegrityViolationException e) {
throw new UserFriendlyException("there.is.already.such.a.value");
}
}
尝试这个模拟代码
when(transactionTemplate.execute(any())).thenAnswer(invocation -> {
TransactionCallbackWithoutResult transactionCallbackWithoutResult = (TransactionCallbackWithoutResult)invocation.getArguments()[0];
transactionCallbackWithoutResult.doInTransaction(new SimpleTransactionStatus());
return null;
});
你可以试试这个,对我有用。
doAnswer(invocation -> {
Consumer<TransactionStatus> consumer = invocation.getArgument(0);
consumer.accept(null);
return null;
}).when(transactionTemplate).executeWithoutResult(any(Consumer.class));
如果您认为向消费者提供 null 参数不是一个好主意,您也可以尝试这个:
doAnswer(invocation -> {
Consumer<TransactionStatus> consumer = invocation.getArgument(0);
consumer.accept(null);
return null;
}).when(transactionTemplate).executeWithoutResult(any(Consumer.class));
....
private TransactionStatus newTransactionStatus() {
return new DefaultTransactionStatus(null, true, false, false, false, null);
}