From 3401d08cf3b19e7f2eabb5b89de39099ea4bc77b Mon Sep 17 00:00:00 2001 From: Stephane Gamard Date: Thu, 11 Sep 2014 15:01:08 +0200 Subject: [PATCH] BaseDao testing for DAO v.2 --- .../java/org/sonar/server/db/BaseDaoTest.java | 92 ++++++++++++------- .../org/sonar/server/db/fake/FakeDao.java | 23 +++++ .../org/sonar/server/db/fake/FakeDto.java | 28 ++++++ .../org/sonar/server/db/fake/FakeMapper.java | 15 +++ .../sonar/server/db/BaseDaoTest/schema.sql | 6 ++ .../org/sonar/server/db/fake/FakeMapper.xml | 31 +++++++ 6 files changed, 163 insertions(+), 32 deletions(-) create mode 100644 server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeDao.java create mode 100644 server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeDto.java create mode 100644 server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeMapper.java create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/db/BaseDaoTest/schema.sql create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/db/fake/FakeMapper.xml diff --git a/server/sonar-server/src/test/java/org/sonar/server/db/BaseDaoTest.java b/server/sonar-server/src/test/java/org/sonar/server/db/BaseDaoTest.java index faa5f05035f..0d9820371fc 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/db/BaseDaoTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/db/BaseDaoTest.java @@ -19,50 +19,78 @@ */ package org.sonar.server.db; +import org.junit.After; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.ClassRule; import org.junit.Test; -import org.sonar.core.persistence.Dto; +import org.sonar.api.utils.System2; import org.sonar.core.persistence.DbSession; -import org.sonar.server.exceptions.NotFoundException; +import org.sonar.core.persistence.MyBatis; +import org.sonar.core.persistence.TestDatabase; +import org.sonar.server.db.fake.FakeDao; +import org.sonar.server.db.fake.FakeDto; +import org.sonar.server.db.fake.FakeMapper; + +import java.util.UUID; import static org.fest.assertions.Assertions.assertThat; -import static org.fest.assertions.Fail.fail; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class BaseDaoTest { - DbSession dbSession = mock(DbSession.class); + @ClassRule + public static TestDatabase db = new TestDatabase().schema(BaseDaoTest.class, "schema.sql"); + + private static final String DTO_ALIAS = "fake"; + + private FakeDao dao; + private DbSession session; + + @BeforeClass + public static void setupBatis() { + MyBatis batis = db.myBatis(); + batis.getSessionFactory().getConfiguration().getTypeAliasRegistry().registerAlias(DTO_ALIAS, FakeDto.class); + batis.getSessionFactory().getConfiguration().addMapper(FakeMapper.class); + } + + + @Before + public void before() throws Exception { + this.session = db.myBatis().openSession(false); + this.dao = new FakeDao(System2.INSTANCE); + } + + @After + public void after() { + this.session.close(); + } @Test - public void getNonNullByKey() throws Exception { - BaseDao dao = mock(BaseDao.class); - FakeDto dto = new FakeDto("ki"); - when(dao.doGetNullableByKey(dbSession, "ki")).thenReturn(dto); - when(dao.getByKey(any(DbSession.class), anyString())).thenCallRealMethod(); - - assertThat(dao.getByKey(dbSession, "ki")).isSameAs(dto); - - try { - dao.getByKey(dbSession, "unknown"); - fail(); - } catch (NotFoundException e) { - assertThat(e).hasMessage("Key 'unknown' not found"); - } + public void has_fake_mapper() { + FakeMapper mapper = db.myBatis().getSessionFactory() + .getConfiguration().getMapper(FakeMapper.class, session); + assertThat(mapper).isNotNull(); } + @Test + public void can_insert_and_select_by_key() throws Exception { + long t0 = System.currentTimeMillis(); + + String key = UUID.randomUUID().toString(); + FakeDto myDto = new FakeDto() + .setKey(key); + dao.insert(session, myDto); + + session.commit(); + assertThat(myDto.getId()); + + long t1 = System.currentTimeMillis(); - static class FakeDto extends Dto { - private final String key; + FakeDto dto = dao.getByKey(session, key); + assertThat(dto).isNotNull(); - public FakeDto(String key) { - this.key = key; - } + assertThat(dto.getUpdatedAt().getTime()).isGreaterThan(t0); + assertThat(dto.getCreatedAt().getTime()).isLessThan(t1); - @Override - public String getKey() { - return key; - } } -} +} \ No newline at end of file diff --git a/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeDao.java b/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeDao.java new file mode 100644 index 00000000000..cdf16ef1b71 --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeDao.java @@ -0,0 +1,23 @@ +package org.sonar.server.db.fake; + +import org.sonar.api.utils.System2; +import org.sonar.core.persistence.DbSession; +import org.sonar.server.db.BaseDao; + +public class FakeDao extends BaseDao { + + public FakeDao(System2 system2) { + super(FakeMapper.class, system2); + } + + @Override + protected FakeDto doInsert(DbSession session, FakeDto item) { + mapper(session).insert(item); + return item; + } + + @Override + protected FakeDto doGetNullableByKey(DbSession session, String key) { + return mapper(session).selectByKey(key); + } +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeDto.java b/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeDto.java new file mode 100644 index 00000000000..80a69bdceb4 --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeDto.java @@ -0,0 +1,28 @@ +package org.sonar.server.db.fake; + +import org.sonar.core.persistence.Dto; + +public class FakeDto extends Dto { + + private long id; + private String key; + + @Override + public String getKey() { + return key; + } + + public long getId() { + return id; + } + + public FakeDto setId(long id) { + this.id = id; + return this; + } + + public FakeDto setKey(String key) { + this.key = key; + return this; + } +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeMapper.java b/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeMapper.java new file mode 100644 index 00000000000..c32ca8e9d06 --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeMapper.java @@ -0,0 +1,15 @@ +package org.sonar.server.db.fake; + +import org.apache.ibatis.annotations.Param; + +import java.sql.Timestamp; +import java.util.List; + +public interface FakeMapper { + + void insert(FakeDto dto); + + FakeDto selectByKey(@Param("key") String key); + + List selectAfterDate(@Param("date") Timestamp date); +} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/db/BaseDaoTest/schema.sql b/server/sonar-server/src/test/resources/org/sonar/server/db/BaseDaoTest/schema.sql new file mode 100644 index 00000000000..bf7df354b67 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/db/BaseDaoTest/schema.sql @@ -0,0 +1,6 @@ +CREATE TABLE "FAKE" ( + "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), + "KEE" VARCHAR(200) NOT NULL, + "CREATED_AT" TIMESTAMP, + "UPDATED_AT" TIMESTAMP +); \ No newline at end of file diff --git a/server/sonar-server/src/test/resources/org/sonar/server/db/fake/FakeMapper.xml b/server/sonar-server/src/test/resources/org/sonar/server/db/fake/FakeMapper.xml new file mode 100644 index 00000000000..dc3aa0a1a62 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/db/fake/FakeMapper.xml @@ -0,0 +1,31 @@ + + + + + + + f.id, + f.kee as "key", + f.created_at as "createdAt", + f.updated_at as "updatedAt" + + + + + + insert into fake (kee, created_at, updated_at) + values (#{key}, #{createdAt}, #{updatedAt}) + + + + + -- 2.39.5