java - Spring JUnit + Mockito + In memory Database (H2) -
i'm using mockito , in memory database (h2) in order test services , dao.
i've tried test method (createroad) of service contains call of dao method :
@service(value = "roadsservice") public class roadsservice implements iroadsservice { @autowired private iroadsdao roadsdao; ... @override public long createroad(createroadcriteria criteria) { string roacodetocopy = ""; roadscriteria roadscriteria = new roadscriteria(); roadscriteria.setce(criteria.getce()); roadscriteria.setdeliverydate(new date()); list<webroadsmodel> listroadsce = roadsdao .getroadsbyceanddeliverydate(roadscriteria); (webroadsmodel wrm : listroadsce) { if (wrm.getroacode().endswith("90")) { roacodetocopy = wrm.getroacode(); break; } } criteria.setroadcode(stringutils.substring(roacodetocopy, 0, 4) + criteria.getroadcode()); // 2. creation of new road long idnewroad = roadsdao.createnewroad(criteria); if (!"".equals(roacodetocopy) && listroadsce.get(0) != null) { roacodetocopy = listroadsce.get(0).getroacode(); // 3. copy dates closed of trn roadscriteria newroadcreated = new roadscriteria(); newroadcreated.setce(criteria.getce()); newroadcreated.setroadid(idnewroad); // 4. paste new road deliverycalendardao.copycloseddates(roadsdao .getroadbycriteria(newroadcreated).get(0).getroacode(), roacodetocopy); } return idnewroad; } ... } i need mock method called getroadsbyceanddeliverydate, because sql query behind not managed h2 driver (query "rank"). then, want use h2 other method in service.
i've tried :
public class roadsservicetest { @injectmocks private roadsservice roadsservice; @mock private mockroaddao roadsdao; @beforeclass public static void setupclass() throws exception { } @before public void setup() throws exception { mockitoannotations.initmocks(this); } @test public void createroad(){ createroadcriteria criteria = new createroadcriteria(); criteria.setroadcode("aa"); criteria.setroadname("aname"); criteria.setce("2"); criteria.setdriver(1); criteria.setvehicle(1); criteria.setsupplier(1); list<webroadsmodel> expected = new arraylist<webroadsmodel>(); mockito.when(roadsdao.getroadsbyceanddeliverydate((roadscriteria) mockito.any())).thenreturn(expected); mockito.when(roadsdao.getnextval(mockito.anystring())).thencallrealmethod(); mockito.when(roadsdao.createnewroad(criteria)).thencallrealmethod(); long result = roadsservice.createroad(criteria); assert.assertequals(5, result); } } it except assertequals. according sql file used in memory database, have sql sequence :
create sequence "seq_siti_roads" minvalue 1 maxvalue 99999 increment 1 start 5 cache 20 ; when run test, result 0. seems mockroaddao not initialized.
public class mockroaddao extends roadsdao { public mockroaddao() throws databaseunitexception, sqlexception, malformedurlexception { idataset dataset = new flatxmldatasetbuilder().build(new file("./src/test/resources/dataset.xml")); datasource datasource = testutils.datasource(); idatabaseconnection dbconn = new databasedatasourceconnection(datasource); databaseoperation.clean_insert.execute(dbconn, dataset); user user = new user(); user.setlangcountry("enfr"); backendcontextholder.setbackendidentifier(new backendidentifierimpl(user)); final namedparameterjdbctemplate jdbctemplate = new namedparameterjdbctemplate(datasource); setjdbctemplate(jdbctemplate); } } public class testutils { private static final logger log = loggerfactory.getlogger(testutils.class); public static datasource datasource; /** * @return */ public static datasource datasource() { if (datasource == null) { embeddeddatabasebuilder builder = new embeddeddatabasebuilder(); embeddeddatabase db = builder.settype(embeddeddatabasetype.h2).addscript("classpath:/siti-create.sql").build(); datasource = db; } return datasource; } ... } could please me :)
thank in advance
edit : @baski : when remove @mock , use reflectionutils instead, constructor of mockroaddao called. but, when run test, method roadsdao.getroadsbyceanddeliverydate() not mocked mockito, method called , unfortunately sql query not managed h2 driver.
public class roadsservicetest { @injectmocks private roadsservice roadsservice; private mockroaddao roadsdao; @beforeclass public static void setupclass() throws exception { } @before public void setup() throws exception { mockitoannotations.initmocks(this); roadsdao = new mockroaddao(); reflectiontestutils.setfield(roadsservice, "roadsdao", roadsdao); } @test public void createroad(){ createroadcriteria criteria = new createroadcriteria(); criteria.setroadcode("aa"); criteria.setroadname("aname"); criteria.setce("2"); criteria.setdriver(1); criteria.setvehicle(1); criteria.setsupplier(1); list<webroadsmodel> expected = new arraylist<webroadsmodel>(); mockito.when(roadsdao.getroadsbyceanddeliverydate((roadscriteria) mockito.any())).thenreturn(expected); mockito.when(roadsdao.getnextval(mockito.anystring())).thencallrealmethod(); mockito.when(roadsdao.createnewroad(criteria)).thencallrealmethod(); long result = roadsservice.createroad(criteria); assert.assertequals(5, result); } }
Comments
Post a Comment