程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何模拟所需的相关实体?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何模拟所需的相关实体??

开发过程中遇到如何模拟所需的相关实体?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何模拟所需的相关实体?的解决方法建议,希望对你解决如何模拟所需的相关实体?有所启发或帮助;

在我的问题中,我想测试 postservice 类。每个新添加的帖子都必须首先为其分配 Book(实体)。有关系 OnetoMany(一本书可以有很多帖子)。因此,如果您想添加新帖子,它将类似于:

post: {
   "Title": "postTitle1","content": "Content of post","bookID": "1"
}

所以我的 savePost 方法是:

@Transactional
public Post savePost(Post post) {
    Optional<Book> bookOpt = Optional.ofNullable(post.getBook());
    Book bookInPost = bookOpt.orElseThrow(() -> new IllegalArgumentException("Book ID for new Post cannot be null!"));
    Book book = bookService.getBook(bookInPost.getID());
    book.addPost(post);
    return postRepository.save(post);
}

现在我想测试这个方法。如何在没有注入 bookRepository/bookService 并且没有真正保存它的情况下在 Post 中模拟 Book ?书也是嵌套的(有类别、作者等),所以如果每次都从 0 开始制作会很困难。我试过这样的事情:

    @Test
    voID should_save_post_assigned_to_book() {
        //given
        Post post = new Post("Title 1","Content 1");
        Book bookToReturnFromrepository = new Book();
        bookToReturnFromrepository.setID(2);
        //when
        when(mockedBookRepository.findByID(any())).thenReturn(Optional.of(bookToReturnFromrepository));
        postservice.savePost(post);
        //then
        Optional<Post> loaded = postRepository.findByID(post.getID());
        assertAll(() -> {
            assertthat(loaded).isPresent(); ...

但这显然是错误的。我该怎么办?

解决方法

您必须首先确定需要测试的内容。在测试 savePost 时,有两个分支:一个是帖子没有书并且方法引发异常,另一个是信息全部存在并且帖子被保存。

考虑到这一点,第一个测试是 verify 在收到不完整的帖子时抛出异常。这里最好也验证没有保存任何内容(postRepository.save() 从未被调用)

对于第二个测试,您需要验证 book.addPost() 是否被调用,以及 postRepository.save(post) 是否在初始帖子中被调用。

对于所有这些,postRepository 的测试替身(模拟)是必不可少的。 假设您正在使用 Mockito 或类似的东西:

@Test(expected = IllegalArgumentException.class)
public void postWithoutBook() {

    // Given a post that doesn't have a book
    final Post post = mock(Post.class);
    when(post.getBook()).thenReturn(null);

    // When trying to save it,we expect an exception to be thrown.
    realPostRepository.savePost(post);

    verify(mockedPostRepository,never()).save(any());
}

@Test
public void postWithBook() {
    // Given a post that does have a book
    final Book book = mock(Book);
    final Post post = mock(Post.class);
    when(post.getBook()).thenReturn(book);

    // When trying to save it...
    realPostRepository.savePost(post);

    // We expect it to be saved.
    verify(mockedPostRepository,times(1)).save(post);
    // And assigned  to a book
    verify(book,times(1)).addPost(post);
}

大佬总结

以上是大佬教程为你收集整理的如何模拟所需的相关实体?全部内容,希望文章能够帮你解决如何模拟所需的相关实体?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: