对包含 TransactionTemplate 的方法进行 Junit 单元测试

问题描述 投票:0回答:2

我有一个方法,其中包含 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");
    }
}
java spring junit mockito
2个回答
0
投票

尝试这个模拟代码

when(transactionTemplate.execute(any())).thenAnswer(invocation -> {
        TransactionCallbackWithoutResult transactionCallbackWithoutResult = (TransactionCallbackWithoutResult)invocation.getArguments()[0];
        transactionCallbackWithoutResult.doInTransaction(new SimpleTransactionStatus());
        return null;
    });

0
投票

你可以试试这个,对我有用。

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.