Reputation: 485
In my test I need simply to test a method insertData
:
@Component
public class DatabaseServiceImpl implements DatabaseService {
@Autowired
DataSource dataSource;
@Override
public int insertData(String var1, int var2, String var3, String var4, int var5, int var6) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
return jdbcTemplate.update("INSERT INTO table_name_here VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
var1, var2, var3, var4, var5, var6,
null, null, null);
}
}
it uses dataSource which is defined bean in config class in java src, so for my test I need to use EmbeddedDataSource
, so I wrote test like this:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DatabaseServiceImplTestConfig.class, loader=AnnotationConfigContextLoader.class)
public class DatabaseServiceImplTest {
@Autowired
@Qualifier("embedded")
DataSource dataSource;
@Test
public void testInsertData() {
...........
DatabaseServiceImpl dsi = new DatabaseServiceImpl();
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
assertEquals(1, dsi.insertData(var1, var2, var3, var4, var5, var6));
...........
}
when I debug this it says that I'm using EmbeddedDataSource
, but JUint throws this exception:
java.lang.IllegalArgumentException: Property 'dataSource' is required
and points to this assertEquals
row. How to prevent it from requiring DataSource
from src package, so it could take this embedded one to complete test? Halp
EDIT
This is test config where I specify the dataSource I NEED to use (even setting the name):
@Bean(name="embedded")
public DataSource embeddedDataSource(DataSourceFactory embeddedDataSourceFactory) {
Same as in src config class:
@Bean
public Datasource dataSource()
The stackTrace is:
java.lang.IllegalArgumentException: Property 'dataSource' is required
at org.springframework.jdbc.support.JdbcAccessor.afterPropertiesSet(JdbcAccessor.java:135)
at org.springframework.jdbc.core.JdbcTemplate.<init>(JdbcTemplate.java:168)
at ......DatabaseServiceImpl.insertData(DatabaseServiceImpl.java:18)
at ......DatabaseServiceImplTest.testInsertData(DatabaseServiceImplTest.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:254)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
but I'm aware it points the dataSource
which is inside insertData method
Upvotes: 0
Views: 75
Reputation: 999
because you are doing a new
in your test, you are losing other dependencies. a little refactoring of your test which looks like below will help to fix.
@Autowired
private DatabaseService databaseService;
@Test
public void testInsertData() {
...........
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
assertEquals(1, databaseService.insertData(datetime, days_rolling, host, start_or_stop, scenario_threadpool_size, days_rolling_weighted));
...........
}
and in your test config add your instance creation for databaseService.
public class DatabaseServiceImplTestConfig {
@Bean
public DatabaseService databaseService() {
return new DatabaseServiceImpl();
}
}
Upvotes: 2