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

Popular posts from this blog

inversion of control - Autofac named registration constructor injection -

verilog - Systemverilog dynamic casting issues -

ios - Change Storyboard View using Seague -