package org.nextprot.api.user.service; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.nextprot.api.commons.dbunit.AbstractUnitBaseTest; import org.nextprot.api.commons.utils.StringGenService; import org.nextprot.api.security.service.JWTCodec; import org.nextprot.api.user.dao.UserQueryDao; import org.nextprot.api.user.domain.UserQuery; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DuplicateKeyException; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.times; import static org.mockito.Mockito.when; public class UserQueryServiceTest extends AbstractUnitBaseTest { // Check why the following annotation could be problematic !!!!! // http://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/ @InjectMocks @Autowired private UserQueryService userQueryService; @Mock private UserQueryDao dao; @Mock private JWTCodec<Map<String, String>> codec; @Mock private StringGenService stringGenerator; @Before public void init() { MockitoAnnotations.initMocks(this); } @Test public void testCreateUserQuery() { final UserQuery userQuery = createUserQuery("ma requete", "une simple requete", "yet another sparql query", true); dressMockedUserQueryDao(userQuery, 10); UserQuery created = userQueryService.createUserQuery(userQuery); assertEquals(10, created.getUserQueryId()); assertEquals("ma requete", created.getTitle()); Mockito.verify(stringGenerator, times(1)).generateString(); } @Test public void testGeneratePubIdInCreateUserQuery() { UserQuery userQuery = createUserQuery("ma requete", "une simple requete", "yet another sparql query", true); Mockito.when(dao.createUserQuery(userQuery)) .thenThrow(new DuplicateKeyException("ERROR: duplicate key value violates unique constraint \"user_queries_pubid_udx\"\n" + " Detail: Key (public_id)=(00000002) already exists.")) .thenThrow(new DuplicateKeyException("ERROR: duplicate key value violates unique constraint \"user_queries_pubid_udx\"\n" + " Detail: Key (public_id)=(00000002) already exists.")) .thenReturn(1L); userQueryService.createUserQuery(userQuery); Mockito.verify(stringGenerator, times(3)).generateString(); } public static UserQuery createUserQuery(String title, String desc, String sparql, boolean published) { UserQuery query = new UserQuery(); query.setTitle(title); query.setDescription(desc); query.setSparql(sparql); query.setPublished(published); return query; } private void dressMockedUserQueryDao(final UserQuery query, final long queryId) { when(dao.createUserQuery(query)).thenReturn(queryId); when(dao.getUserQueryById(queryId)).thenReturn(query); } }