How to mock existing and Entity with Mockito and jUnit

I am trying to find a way to test my entity with Mockito;

This is a simple testing method:

@Mock
private EntityManager em;

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

How better am I to make fun of the behavior that EntityManager changes Id from 0L to ie 1L? Perhaps with the least obstacles to readability.

Edit: Additional information; EntityManager outer scope is created by the application container

+5
source share
4 answers
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));
+5
source

You can use Mockito for this Answer.

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 calling a method, the persistfirst argument must have its own method setId.

, , . , Mockito Answer, Article EntityManager.

+9

similar answer as above but with lambdas

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

Correct answer

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

All Articles