5

私は@Autowire自分のクラスorg.springframework.core.io.ResourceLoaderの 1 つに参加しています。@Service

ResourceLoaderテスト中に のインスタンスにアクセスして、テスト対象のサービスに挿入できるようにしたいと考えています。ResourceLoaderテスト中にの完全に機能するインスタンスを取得する最良の方法は何ですか?

それが不可能な場合、代替手段はありResourceLoaderますか? 基本的に、サービスにプロジェクトからいくつかの静的ファイルを読み取らせる必要があります。

更新

テストで@RunWith(SpringJUnit4ClassRunner.class)+を使い始めました。@ContextConfigurationただし、ResourceLoader現在サービスに注入されている は@Autowire、通常とは異なる動作をします (つまり、テスト コンテキストにない場合)。テストでResourceLoader#getResourceは、通常の実行中に表示される適切な絶対パスではなく、不正な相対パスを指す Resource を返します。

デバッグ中に発見されたその他の情報:

  • テスト中、 @AutowiredresourceLoaderは instanceof ですorg.springframework.context.support.GenericApplicationContext
  • 通常の実行中resourceLoaderは、のインスタンスですorg.springframework.web.context.support.XmlWebApplicationContext
4

4 に答える 4

3

どのようなテストを書きたいですか?

単体テストの場合は、おそらくモックResourceLoaderを作成して、そのモックをサービス インスタンスに挿入する必要があります。(たとえば、mockito を使用)

統合テストの場合は、Spring TestContextフレームワークを使用したほうがよいでしょう。テストに必要なすべてのコンポーネントを含むスプリング コンテキストを作成し、テスト クラスに@RunWith(SpringJUnit4ClassRunner.class)+ @ContextConfigurationで注釈を付けます。これにより、テスト クラスで完全に構成された Bean (テスト対象のサービス インスタンスなど) をオートワイヤできるようになります。

于 2013-11-12T11:55:11.363 に答える
1

service次のように定義されていると思います。

public class ResourceService {
    @Autowired
    ResourceLoader loader;
}

さて、あなたのテストを書くときResourceService

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-config.xml" })
public class ResourceServiceTest {
    @Autowired
    ResourceService resourceService;
    @Test
    public void test() {
    ...
    }
}

Spring TestContext フレームワークは、依存性注入を介してテスト クラスのインスタンスを構成します。したがって、テストクラスでオートワイヤーすると、Spring はオートワイヤーされたプロパティを にResourceService注入します。ResourceLoaderResourceService

于 2013-11-12T12:07:57.073 に答える