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

使用Mockito在不接触数据库的情况下测试Spring-Boot存储库接口方法

范承教
2023-03-14
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class TransactionServiceTests {

    @Rule
    public MockitoRule mockitoRule = MockitoJUnit.rule();

    @Mock
    private MessagingService mockMessagingService;
    @Mock
    private CustomerRepository mockCustomerRepository;

    @Autowired
    TransactionService transactionService;

    @Test
    public void testTransactionBetweenCustomersAndBalanceOfReceiver() {

        int AMOUNT = 50;

        // prepare your test data unless you always expect those values to exist.
        Customer customerReceiver = new Customer();
        customerReceiver.setName("TestReceiver");
        customerReceiver.setBalance(12);
        mockCustomerRepository.save(customerReceiver);

        Customer customerSender = new Customer();
        customerSender.setName("TestSender");
        customerSender.setBalance(50);
        mockCustomerRepository.save(customerSender);

        int expectedReceiverAmount = customerReceiver.getBalance() + AMOUNT;
        int expectedSenderAmount = customerSender.getBalance() - AMOUNT;
        transactionService.makeTransactionFromSenderToReceiver(customerSender, customerReceiver, AMOUNT);

        assertEquals(expectedSenderAmount, customerSender.getBalance());
        assertEquals(expectedReceiverAmount, customerReceiver.getBalance());

    }
}
@Service
public class TransactionService {

    private MessagingService messagingService;
    private CustomerRepository customerRepository;

    private static final Logger log = LoggerFactory.getLogger(TransactionService.class);

    @Autowired
    public TransactionService(MessagingService messagingService, CustomerRepository customerRepository){
        Assert.notNull(messagingService, "MessagingService cannot be null");
        this.messagingService = messagingService;
        Assert.notNull(customerRepository, "CustomerRepository cannot be null");
        this.customerRepository = customerRepository;
    }

    public void makeTransactionFromSenderToReceiver(Customer sender, Customer receiver, int amount) {

        if (sender.getBalance() >= amount) {
            sender.setBalance(sender.getBalance() - amount);
            receiver.setBalance(receiver.getBalance() + amount);

            customerRepository.save(sender);
            customerRepository.save(receiver);
        }

        else {    
            throw new RuntimeException();
        }
    }
}

共有1个答案

苏高旻
2023-03-14

“模拟”存储库方法调用。另外,对TransactionService使用@injectmocks代替@autowired。您还可以使用MockitoJunitRunner。如何模拟存储库调用:

when(customerRepository.save(sender)).thenReturn(someSenderInstance);

要验证是否调用了mocked方法调用,请使用:

verify(customerRepository, times(1)).save(sender);

还有,记住一件事:您正在测试服务!因此,所有对数据库的调用都应该被模仿。

 类似资料:
  • 我有一个现有的spring 4项目(mvc、jdbc等),我试图将其移植到spring boot,但我做不到(许多依赖项存在问题,没有人能解释我是如何做到这一点的)。但现在我只想在现有项目中使用Spring数据JPA。这是pom的一个主要依赖项: 我使用EntityManagerFactorybean(在所有示例中都使用)完成了现有配置。数据库配置: 用于测试的Derby数据库。但主要数据库类型是

  • 是否可以在没有数据库连接的情况下运行我的测试?如果是,我做错了什么/错过了什么?

  • 我创建了一个简单应用程序,它使用Spring boot和JPA/Hibernate将消息保存在postgresql数据库中。所有的包Controller/Service/Repository都在一个子包中。 但我得到一个错误:spring boot无法识别包DAO中的存储库接口。 我有另一个项目,所有工作都不使用@enablejparepositories,但在这个项目(相同的结构)中,我遇到了这

  • 我有一个Spring Boot应用程序,注释为。几乎所有的存储库都需要实现一些自定义逻辑,这是使用完成的。 是否有方法创建将从机制中排除的存储库?

  • 我正在尝试实现一个简单的REST服务,该服务基于具有Spring启动和Spring数据Rest的JPA存储库。(请参阅此教程)如果将以下代码与 gradle 一起使用,则运行良好: 为了让事情变得更简单,我使用Spring boot CLI(“Spring run”命令)尝试了相同的代码。 不幸的是,这似乎不起作用@RepositoryRestResource似乎无法像@RestControlle

  • 我想要一个在Spring数据的帮助下创建的存储库(例如)。我不熟悉spring-data(但不熟悉spring),我使用本教程。我选择的处理数据库的技术是JPA2.1和Hibernate。问题是我不知道如何为这样的存储库编写单元测试。 让我们以方法为例。由于我正在进行测试--首先,我应该为它编写一个单元测试--这就是我遇到三个问题的地方: > 首先,如何将的模拟注入到不存在的接口实现中?Sprin