2

私はSpring 3.0とjUnit 4.8を使用しており、単体テストを開発しようとしています。

実際、jUnit によって使用されるアプリケーション コンテキストにロードされた XML で定義されたテスト ケースで、依存性注入を使用して Bean のプロパティ (ファイル) を設定しようとしているだけです。

jUnit 4アプローチの注釈を使用してロードされたXMLファイル構成を使用しています。これは、すべてのテスト クラスが使用したメインの BaseTest です。

@ContextConfiguration("/test-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@Ignore
public class BaseTest { ... }

そして、これはのセクションですtest-context.xml

<context:component-scan base-package="com.test" />  

<bean id="ExtractorTest" class="com.test.service.ExtractorTest">
    <property name="file" value="classpath:xls/SimpleFile.xls"></property>
</bean>

したがって、テスト()を使用してクラスでやろうとしていることはExtractorTest、クラスパス内にロードされたファイルで「ファイル」プロパティを設定することだけです。

テストを含むクラスのセクションを次に示します。

public class ExtractorTest extends BaseTest {

    private Resource file;
    private InputStream is;

    public void setFile(Resource file) {
        this.file = file;
    }

    @Before
    public void init() {
        this.is = this.getClass().getResourceAsStream("/xls/SimpleFile.xls");
        Assert.assertNotNull(is);
    }

    @Test
    public void testLoadExcel() throws IOException {
        // file is always null, but the InputStream (is) isn't!
        Assert.assertNotNull(file.getFile());
        InputStream is = new FileInputStream(file.getFile());
        HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(is));
        // todo...
    }

}

問題は、ブレークポイントを追加し、Spring がプロパティを OK に設定しているため、セッターが機能することです。しかし、テスト メソッドが開始されると null になります。これは、実行中の別のインスタンスが原因である可能性がありますが、なぜでしょうか? テスト用のアプリケーション コンテキストの XML を使用してロードされるように「ファイル」を設定するにはどうすればよいですか? jUnitを使用して割り当てることができず、その理由と方法がわかりません。@Before メソッドでの書き込みを避けようとしていますが、それが良いアプローチであるかどうかはわかりません...

ありがとうございました。

PD: 私の英語でごめんなさい;-)

4

1 に答える 1

3

ExtractorTestSpring はJUnit が使用するインスタンスを作成しないため、構成は機能しません。代わりに、インスタンスは JUnit によって作成され、後処理のために Spring に渡されます。

表示される効果は、アプリケーション コンテキストが id を持つ Bean を作成するExtractorTestが、誰もそれを使用しないためです。

擬似コード:

ApplicationContect appContext = new ...
appContext.defineBean("ExtractorTest", new ExtractorTest()); // Calls setter

ExtractorTest test = new ExtractorTest(); // Doesn't call setter
test.postProcess(appContext); // inject beans from appContext -> does nothing in your case

したがって、解決策は Bean を定義することですfile:

<bean id="file" class="..." />

(bean のビルド方法のドキュメントを参照してくださいResource) そして、Spring にそれを注入させます。

@Autowired
private Resource file;
于 2012-08-02T12:00:07.207 に答える