lpkej
lpkej

Reputation: 485

Testing method with multiple bean dependency

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

Answers (1)

Jayesh
Jayesh

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

Related Questions