【问题标题】:spring-boot: mockito ignoring test criteria and returning passed testspring-boot:mockito 忽略测试标准并返回通过的测试
【发布时间】:2016-09-13 07:54:54
【问题描述】:

我有下面提到的使用 Mockito 的测试类。问题是它似乎忽略了我的 setClientId 参数。如果我将其设置为:

when(mockTransactRepViewRepository.findByClientIdAndBatchDateBetween("SETRANDOMHERE", todayDateTime.toDate(), todayDateTime.plusDays(1).toDate()))
                    .thenReturn(Arrays.asList(transactRepViewModelTest, transactRepViewModelTest2));

测试仍然通过。他们不应该失败吗?还是我误解了 Mockito 中的某些内容?

测试类

@RunWith(MockitoJUnitRunner.class)
@SpringApplicationConfiguration(classes = TransactRepViewRepository.class)
public class TransactRepViewRepositoryTest {

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

    @Mock
    private TransactRepViewRepository mockTransactRepViewRepository;

    @Test
    public void testFindByClientIdAndBatchDateBetween() {
        DateTime todayDateTime = new DateTime().withTimeAtStartOfDay();

        TransactRepViewModel transactRepViewModelTest = new TransactRepViewModel();
        transactRepViewModelTest.setClientId("123456");
        transactRepViewModelTest.setBatchDate(todayDateTime.toDate());
        mockTransactRepViewRepository.save(transactRepViewModelTest);

        TransactRepViewModel transactRepViewModelTest2 = new TransactRepViewModel();
        transactRepViewModelTest2.setClientId("123456");
        transactRepViewModelTest2.setBatchDate(todayDateTime.plusDays(1).toDate());
        mockTransactRepViewRepository.save(transactRepViewModelTest2);

        when(mockTransactRepViewRepository.findByClientIdAndBatchDateBetween("123465", todayDateTime.toDate(), todayDateTime.plusDays(1).toDate()))
                .thenReturn(Arrays.asList(transactRepViewModelTest, transactRepViewModelTest2));
        verify(mockTransactRepViewRepository, times(1)).save(transactRepViewModelTest);
        verify(mockTransactRepViewRepository, times(1)).save(transactRepViewModelTest2);
    }

以防万一,这是 Repository 类:

public interface TransactRepViewRepository extends JpaRepository <TransactRepViewModel, Long> {
...
List<TransactRepViewModel> findByTerminalnameIgnoreCaseContainingAndClDateBetween(String terminalName, Date startDate, Date endDate) throws DataAccessException;
...
}

【问题讨论】:

    标签: java unit-testing spring-boot mockito


    【解决方案1】:

    其实你不是asserting。在您的情况下,您只是verifying 调用了特定方法。这就是你在这种情况下取​​得成功的原因。您要么必须添加assert,要么例如更改verify

    代替:

    verify(mockTransactRepViewRepository, times(1)).save(transactRepViewModelTest);
    

    你可以这样做:

    verify(mockTransactRepViewRepository, times(2)).save(transactRepViewModelTest);
    

    你是verify(你在这里得到一个错误)你的方法只被调用了一次,但不是两次

    快速笔记

    我看到您正在编写Spring Boot 测试。请在此处查看如何正确编写测试。顺便说一句,添加了很多额外的助手。你可以在Spring blog查看它。

    【讨论】:

    • 我已经这样做了:assertThat(mockTransactRepViewRepository .findByClientIdAndClDateBetween("123456", todayDateTime.toDate(), todayDateTime.plusDays(1).toDate()).get(0)) .isSameAs(transactRepViewModelTest); 但即使我将模型客户端 ID 的值更改为其他值,测试仍然没有失败。
    • 哦,看来你需要这样的东西stackoverflow.com/questions/1142837/…
    • 其实不是。您有一个与数据库交互的存储库层。但是你在这里嘲笑一切:) 从我的角度来看,随着时间的推移,这样的测试可能毫无用处,因为你几乎总是会得到稳定的结果。如果您正在测试算法或类似的东西,单元测试很好,但在这种情况下,它不是要走的路。您应该考虑集成测试。我建议你看看dbunit.sourceforge.net。这个东西可以为一些测试准备数据库,你可以编写预期的数据库。
    • 你也可以看看 jhipster 项目jhipster.github.iogithub.com/jhipster/jhipster-sample-app/blob/master/src/test/… 在这里他们正在准备测试数据库(hsqldb)并使用真实方法进行所有测试,无需模拟。希望对您有所帮助! :)
    • 是的,没错。你必须接触真正的数据库。此外,如果每个开发人员都有自己的测试数据库来接触它,那就太好了。 但是你有另一个选择,就像 jhipster 一样。他们正在使用内存数据库进行测试。如果您有一个干净的新项目,其中包含非常简单的 SQL 查询,这可能是一个非常方便的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 2016-05-15
    • 2017-01-26
    • 2021-12-12
    • 1970-01-01
    • 2020-02-06
    • 2023-04-08
    相关资源
    最近更新 更多