java 如何使用 Mockito 和 jUnit 模拟持久化和实体

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26945891/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 10:55:35  来源:igfitidea点击:

How to mock persisting and Entity with Mockito and jUnit

javajunitmockitohamcrest

提问by Patrick

I'm trying to find a way to test my entity using Mockito;

我正在尝试找到一种使用 Mockito 测试我的实体的方法;

This is the simple test method:

这是简单的测试方法:

@Mock
private EntityManager em;

@Test
public void persistArticleWithValidArticleSetsArticleId() {
    Article article = new Article();
    em.persist(article);
    assertThat(article.getId(), is(not(0L)));
}

How do I best mock the behaviour that the EntityManager changes the Id from 0L to i.e. 1L? Possibly with the least obstructions in readability.

我如何最好地模拟 EntityManager 将 Id 从 0L 更改为 1L 的行为?可能对可读性的阻碍最小。

Edit: Some extra information; Outside test-scope the EntityManager is produced by an application-container

编辑:一些额外的信息;在测试范围之外,EntityManager 由应用程序容器生成

回答by Dawood ibn Kareem

You could use a Mockito Answerfor this.

您可以Answer为此使用 Mockito 。

doAnswer(new Answer<Object>(){
     @Override
     public Object answer(InvocationOnMock invocation){
        Article article = (Article) invocation.getArguments()[0];
        article.setId(1L);
        return null;
     }
  }).when(em).persist(any(Article.class));

This tells Mockito that when the persistmethod is called, the first argument should have its setIdmethod invoked.

这告诉 Mockito 当persist方法被调用时,第一个参数应该setId调用它的方法。

But if you do this, I don't understand what the purpose of the test would be. You'd really just be testing that the Mockito Answermechanism works, not that the code of Articleor of EntityManagerworks correctly.

但是如果你这样做,我不明白测试的目的是什么。您实际上只是在测试 MockitoAnswer机制是否有效,而不是Article或的代码EntityManager是否正常工作。

回答by JB Nizet

public class AssignIdToArticleAnswer implements Answer<Void> {

    private final Long id;

    public AssignIdToArticleAnswer(Long id) {
        this.id = id;
    }

    @Override
    public Void answer(InvocationOnMock invocation) throws Throwable {
        Article article = (Article) invocation.getArguments()[0];
        article.setId(id);
        return null;
    }
}

And then

接着

doAnswer(new AssignIdToArticleAnswer(1L)).when(em).persist(any(Article.class));

回答by gmode

similar answer as above, but with lambdas

与上面类似的答案,但使用 lambdas

   doAnswer((InvocationOnMock invocation) -> {
        Article article = (Article) invocation.getArguments()[0];
        article.setId(1L);
        return null;
    }).when(em).persist(any(Article.class));