java - How to control the @PostConstruct when integration testing using Spring -
i have spring bean class redisrepo inside initialising database connection @postconstruct:
@postconstruct public void init() { logger.debug("redisrepo, init."); client = new redisclient(redis_host, redis_port); ... }
i creating bean using java config @ springconfiguration.class:
@bean @scope("singleton") public redisrepo redisjrepo() { return new redisrepo(); }
i started build integration tests using spring. using same configuration class (springconfiguration.class) tests:
@runwith(springjunit4classrunner.class) @springapplicationconfiguration(classes = springconfiguration.class)
my test class using embedded-redis need init right before start tests:
@before public void init() throws ioexception { //init embedded-redis }
the problem when start tests @postconstruct of redisrepo class executed before integration-test init() class (past below) leading me null since embedded redis hasnt initialised yet.
how avoid it? mybe not doing right?
thanks, ray.
i suggest consider using spring boot auto-configuration (@enableautoconfiguration
or @springbootapplication
) initialize redis connection. can use these spring boot properties customize redis:
# redis (redisproperties) spring.redis.database= # database name spring.redis.host=localhost # server host spring.redis.password= # server password spring.redis.port=6379 # connection port spring.redis.pool.max-idle=8 # pool settings ... spring.redis.pool.min-idle=0 spring.redis.pool.max-active=8 spring.redis.pool.max-wait=-1 spring.redis.sentinel.master= # name of redis server spring.redis.sentinel.nodes= # comma-separated list of host:port pairs
this remove need connection initialization in @postconstruct
production code , can autowire redis related beans context dusting testing.
edit1:
to populate redis instance before testing method can use @beforemethod
(using testng) or @before
(using junit). populate before test after context initialized use @postconstruct in test class.
edit2:
you asked on generic rule how overcome need initialization of resources in @postconstruct
. believe problem how wiring beans in application.
your @postconstruct
initialization done in other bean, redisclient
stored variable client
. argue mixing of concerns. if register redisclient
bean spring context way:
@bean public redisclient redisclient() { redisclient client = new redisclient(redis_host, redis_port); ... return client; }
you can autowire bean had @postconstruct
initialization. able autowire during test. if redisclient
not thread-safe, may want consider prototype or request scope it.
with approach, extremely use @postconstruct
, use spring ioc container handle reusable resource instances.
Comments
Post a Comment