0

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

0

1 Answer 1

2

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();
   }
}
Sign up to request clarification or add additional context in comments.

1 Comment

Jayesh, worked like a charm! And for me, back to spring documentation.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.