5

何らかの理由で、@Value他のテスト クラスのベースとして使用しているクラスに注釈が挿入されません。私は Spring を初めて使用し、Java に関する私の知識はまだ最高ではありません。これは、経験豊富な人にとってははるかに明白になると確信していますが、これを理解することはできません。

メソッドをコメントアウトするsetDbProperties()と、フィールドにデータが入力されますが、@Value注釈だけでは、フィールドに null 値が表示されます。

これが私の基本テストクラスです:

package com.blah;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.operation.DatabaseOperation;
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
        "classpath:/WEB-INF/application-context.xml",
        "classpath:/WEB-INF/application-context-test.xml" })
@ActiveProfiles("test")
public abstract class BaseDbTestCase extends DBTestCase {

    @Value("${test.db.connection.url}")
    private String connectionUrl;

    @Value("${test.db.driver.class}")
    private String driverClass;

    @Value("${test.db.username}")
    private String dbUserName;

    @Value("${test.db.password}")
    private String dbPassword;

    @Value("${test.db.datasource.path}")
    private String dataSource;

    public BaseDbTestCase(String name) throws IOException {

        super(name);

        // setDbProperties();

        System.setProperty(
                PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS,
                driverClass);
        System.setProperty(
                PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL,
                connectionUrl);
        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME,
                dbUserName);
        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD,
                dbPassword);
    }

    @After
    public void after() throws Exception {
        DatabaseOperation.DELETE_ALL.execute(getConnection(), getDataSet());
    }

    @Override
    protected IDataSet getDataSet() throws Exception {
        return new FlatXmlDataSetBuilder()
                .build(new FileInputStream(dataSource));
    }

    private void setDbProperties() throws IOException, FileNotFoundException {

        Properties properties = new Properties();

        properties.load(new FileInputStream(
                "src/main/java/resources/application.properties"));

        connectionUrl = properties.getProperty("test.db.connection.url");
        driverClass = properties.getProperty("test.db.driver.class");
        dbUserName = properties.getProperty("test.db.username");
        dbPassword = properties.getProperty("test.db.password");
        dataSource = properties.getProperty("test.db.datasource.path");
    }

    @Override
    protected DatabaseOperation getSetUpOperation() throws Exception {
        return DatabaseOperation.REFRESH;
    }

    @Override
    protected DatabaseOperation getTearDownOperation() throws Exception {
        return DatabaseOperation.NONE;
    }

    @Before
    public void init() throws Exception {
        DatabaseOperation.REFRESH.execute(getConnection(), getDataSet());
    }

}

ご覧のとおり、他の Spring (および非 Spring) アノテーションがこのクラスで機能しています。

私は<context:property-placeholder location="classpath:/resources/application.properties" />自分のアプリケーションコンテキストにあります。

また、@Valueアノテーションは、クラスを拡張するクラスで正常に機能していますBaseDbTestCase

ティア

更新: システム プロパティの設定を init() メソッド (注釈付き) に移動するという @Biju の提案を@Before受けた後、次のスタック トレースを取得しています。デバッグに基づいて、エラーをスローする前にコンストラクターを通過していないようです。

org.dbunit.assertion.DbAssertionFailedError: driverClass is null
    at org.dbunit.assertion.DefaultFailureHandler$DefaultFailureFactory.createFailure(DefaultFailureHandler.java:265)
    at org.dbunit.assertion.DefaultFailureHandler.createFailure(DefaultFailureHandler.java:110)
    at org.dbunit.assertion.SimpleAssert.fail(SimpleAssert.java:90)
    at org.dbunit.assertion.SimpleAssert.assertTrue(SimpleAssert.java:77)
    at org.dbunit.assertion.SimpleAssert.assertNotNullNorEmpty(SimpleAssert.java:61)
    at org.dbunit.JdbcDatabaseTester.<init>(JdbcDatabaseTester.java:103)
    at org.dbunit.PropertiesBasedJdbcDatabaseTester.<init>(PropertiesBasedJdbcDatabaseTester.java:68)
    at org.dbunit.DBTestCase.newDatabaseTester(DBTestCase.java:70)
    at org.dbunit.DatabaseTestCase.getDatabaseTester(DatabaseTestCase.java:109)
    at org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:151)
    at junit.framework.TestCase.runBare(TestCase.java:132)
    at junit.framework.TestResult$1.protect(TestResult.java:110)
    at junit.framework.TestResult.runProtected(TestResult.java:128)
    at junit.framework.TestResult.run(TestResult.java:113)
    at junit.framework.TestCase.run(TestCase.java:124)
    at junit.framework.TestSuite.runTest(TestSuite.java:243)
    at junit.framework.TestSuite.run(TestSuite.java:238)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
4

2 に答える 2

0

私が考える理由は、 BaseDbTestCaseBaseDbTestCaseのに基づいて新しいテストケースを派生させると、派生したテストケースでは実際には表示されないためです-最終的なテストケースになければなりません。@ContextConfiguration@ContextConfiguration

アップデート:

上記の内容は正しくありません。一度テストしたところ、基本クラス@ContextConfigurationでも十分であり、基本クラスのフィールドに@RunWith正しく挿入されているようです。@Value

今あなたが抱えている問題は、変数がコンストラクターで利用可能になることを期待しているためです@Value-インスタンスが作成された後に解決されるため、変数は利用できません-あなたの場合は、変数がコンストラクタは失敗します。@Before代わりに、Junit の注釈付きメソッドでプロパティを設定できるはずです

于 2012-10-05T16:55:51.663 に答える
0

BaseDbTestCase を拡張する具象クラスを用意し、具象クラスに @ContextConfiguration を配置します。他のテスト クラスがこの具象クラスを拡張するようにします。

于 2012-10-05T17:32:46.153 に答える