Archiv pro měsíc October, 2008

Unit testy s knihovnou EasyMock

Možná jsem někde zaspal, ale knihovnu EasyMock jsem začal používat teprve nedávno u nás ve firmě. Jeho schopnosti a snadnost použití jsou tak výrazné, že rozhodně stojí za představení.

K čemu je to vlastně dobré

EasyMock je pomocník pro psaní unit testů. Unit testy slouží k otestování jedné třídy. Nezajímají nás objekty, se kterými testovaná třída spolupracuje. Buď věříme tomu, že fungují správně…a nebo tyto závislosti namockujeme.

Namocková je nahrazení skutečných spolupracujících tříd tzv mocky. Mock je proxy implementující určitý interface. U této proxy máme možnost nadefinovat její chování programově pomocí API.

Jak to funguje

  1. Vytvoříte mock objekt (1. řádek kódu)
  2. Nadefinujete jeho chování (včetně návratových typů a výjímek)
  3. Nadefinujete požadované volání metod (EasyMock kontroluje i jejich pořadí)
  4. Přepnete se do přehrávací fáze
  5. Spustíte vlastní unit test
  6. EasyMock za vás ověří, že byly splněny všechny podmínky nadefinované v bodě 2 a 3

EasyMock se velmi hodí tam, kde používáte návrhový vzor IoC a potřebujete otestovat beanu, která potřebuje mít nasetované reference na ostatní beany. Ideálně, když referencované beany jsou interfacy (EasyMock umí mockovat pomocí rozšížení i classy). Pomocí EasyMocku si tedy vytvoříte přislušné mocky, nahrajete jejich chování. Zavoláte testovanou metodu a Easymock zkontroluje, zda všechno proběhlo podle vašich požadavků.

Malá ukázka testu z příkladu (EasyMockDemo­.zip, ZIP 260 KB): .

public class TestServiceImplTest extends TestCase {
        private TestServiceImpl testServiceImpl;
        private TestDao testDao;

        public void test_getBeanById_ok() throws Exception {
                Bean bean1 = new Bean();
                bean1.setId(1);

                EasyMock.expect(testDao.getBeanById(1)).andReturn(bean1);

                replay();

                Bean bean = testServiceImpl.getBeanById(1);
                assertEquals(1, bean.getId());

                verify();
        }

        public void test_getBeanById_null_returned() throws Exception {
                EasyMock.expect(testDao.getBeanById(1)).andReturn(null);

                replay();

                Bean bean = testServiceImpl.getBeanById(1);
                assertNull(bean);

                verify();
        }

        public void test_getBeanById_exception_thrown() throws Exception {
                Bean bean1 = new Bean();
                bean1.setId(1);

                EasyMock.expect(testDao.getBeanById(1)).andThrow(new DaoException("Some DAO exception"));

                replay();

                try {
                        testServiceImpl.getBeanById(1);
                        fail();
                } catch (ServiceException e) {

                }

                verify();
        }

        protected void replay() {
                EasyMock.replay(testDao);
        }

        protected void verify() {
                EasyMock.verify(testDao);
        }

        @Override
        protected void setUp() throws Exception {
                super.setUp();
                testServiceImpl = new TestServiceImpl();
                testDao = EasyMock.createMock(TestDao.class);
                testServiceImpl.setTestDao(testDao);
        }

        @Override
        protected void tearDown() throws Exception {
                super.tearDown();
                testServiceImpl = null;
                testDao = null;
        }
}

Závěr

Bez mock testů si dnes unit testy už nedovedu představit.

Odkazy

Celý článek 3 komentářů 21. October 2008


Kalendář

October 2008
M T W T F S S
« Sep   Mar »
 12345
6789101112
13141516171819
20212223242526
2728293031  

Články podle měsíců

Kategorie

Locations of visitors to this page