0

私はSpringMVCとJDBCTemplateを初めて使用しますが、これについてはひどく助けが必要です。applicationContext.xmlで次のように宣言しました。

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://" />
    <property name="username" value="user" />
    <property name="password" value="pwd" />
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

私のDAOImplクラスには、次のコードがあります。

@Repository
public class ABCDAOImpl implements ABCDAO
{

    private String INSERT_SQL = null;
    private JdbcTemplate jdbcTemplate;

    @Autowired
    public void setDataSource(DataSource dataSource)
    {
        this.jdbcTemplate = new JdbcTemplate( dataSource );
    }

    @Override
    public boolean insertDataInDataBase(final Object obj)
    {
        boolean insertSuccessful = false;

        INSERT_SQL = "INSERT INTO XXX " +
                "(AA, BB, CC, DD, EE, " +
                "FF, GG, HH, II) VALUES (?,?,?,?,?,?,?,?,?)";

    KeyHolder keyHolder = new GeneratedKeyHolder();
    jdbcTemplate.update(new PreparedStatementCreator() 
            {public PreparedStatement createPreparedStatement(Connection connection) 
                           throws SQLException
                {
                  PreparedStatement ps = null;
                  ps = connection.prepareStatement(INSERT_SQL);
                  ps.setString(1, xx);
                  ps.setString(2, xx);
                  ps.setString(3, xx);
                      ps.setString(4, xx);
                  ps.setString(5, xx);
                  ps.setString(6, xx;
                  ps.setString(7, xx);
                  ps.setString(8, xx);
                  ps.setString(9, xx);
                  return ps;
                  }}, keyHolder);

        return insertSuccessful;    
    }
}

テストクラス:

  import static org.junit.Assert.assertTrue;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath:applicationContext.xml"})
    public class ABCDAOImplTest
    {
    private Object object = new Object();
    private ABCDAOImpl abcDAOImpl;

    @Before
    public void setup()
    {
        object.setAllVaribles();
        abcDAOImpl = new ABCDAOImpl();
    }

    @Test
    public void testRepositoryInsert()
    {
        System.out.println(abcDAOImpl.insertDataInDataBase(object));
        assertTrue(abcDAOImpl.insertDataInDataBase(object));
    }

}

次に、jdbcTemplateを使用して、PreparedStatementCreatorを使用して挿入ステートメントを実行します。
今、私はこのコードが機能するかどうかをテストしようとしています(モックなしで、テストするためだけに値をハードコーディングしています..)?このテストを実行すると、jdbcTemplateがnullであるというNPEが表示されます。コードに何か問題がありますか、それともテスト方法に問題がありますか?どんな助けでも大歓迎です。

あけましておめでとう :)

PS-@Pradeepからのコメントの後でのみ、テストクラスに@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = {"classpath:applicationContext.xml"})で注釈を付けました。そして今、私は別の例外を受け取ります:「ApplicationContextのロードに失敗しました。」

4

2 に答える 2

1

最も明白な答えは、テストがsetDataSource()メソッドを呼び出していないか、JdbcTemplateを作成するようなことを何もしていないということです。ただし、問題がどこにあるかを誰かが指摘するのに十分なコードを示していません。

更新:あなたのテストでは、あなたは言うabcDAOImpl = new ABCDAOImpl();、そしてそれはすべてです。JdbcTemplate / DataSourceがどのように注入されると思いますか?それは魔法では起こりません。すべてを手動で配線し終えるか、SpringにDAOをテストに注入させる必要があります。これを行うには、次のようなフィールドを追加するだけです。

@Autowired
private ABCDAO abcDao;
于 2013-01-01T05:02:59.387 に答える
0

たぶんあなたの行方不明のapplicationContext.xmlファイルのtest-applicationContext.xmlインポート

<import resource="classpath:applicationContext.xml" />
于 2013-01-01T05:18:02.110 に答える