web-dev-qa-db-ja.com

コンテキスト構成の場所とクラスを処理できません

私は次のテストを書きました:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:META-INF/dataContext.xml"},classes = Configiuration.class)
@ActiveProfiles("test")
public class CityDaoImplTest {
....
}

XmlファイルとJava class burの呼び出し時に構成を使用する必要があります

コンソールで次のように見えるmvnテスト:

Tests in error: 
  initializationError(***.CityDaoImplTest): Cannot process locations AND classes for context configuration [ContextConfigurationAttributes@5bb21b69 declaringClass = '***.CityDaoImplTest', classes = '{***.Configiuration}', locations = '{classpath:META-INF/dataContext.xml}', inheritLocations = true, initializers = '{}', inheritInitializers = true, name = [null], contextLoaderClass = 'org.springframework.test.context.ContextLoader']; configure one or the other, but not both.

設定を書き換えずに修正するにはどうすればよいですか?

20
gstackoverflow

Spring Docs から:

Spring 3.1以前は、パスベースのリソースロケーションのみがサポートされていました。 Spring 3.1以降、コンテキストローダーはどちらかパスベースまたはクラスベースのリソースをサポートすることを選択できます。 Spring 4.0.4以降、コンテキストローダーはパスベースのおよびクラスベースのリソースを同時にサポートすることを選択できます。

ただし、春のテストでは、小さな注意点があります。 SmartContextLoaderに基づくAbstractDelegatingSmartContextLoaderを使用していますが、残念ながらそれほどスマートではありません;)

@Override
public void processContextConfiguration(
        final ContextConfigurationAttributes configAttributes) {

    Assert.notNull(configAttributes, "configAttributes must not be null");
    Assert.isTrue(!(configAttributes.hasLocations() && configAttributes.hasClasses()), String.format(
        "Cannot process locations AND classes for context "
                + "configuration %s; configure one or the other, but not both.", configAttributes));

コードに示すように、場所とクラスの両方を設定することはできません。

だから、これを修正する方法は? 1つの解決策は、次のような追加の構成クラスを追加することです。

@Configuration
@ImportResource("classpath:META-INF/dataContext.xml")
class TestConfig {

}

また、テストコードでは以下を使用します。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Configuration.class, TestConfig.class})
@ActiveProfiles("test")
public class CityDaoImplTest { ... }

技術的には、これは構成の書き換えですが、既存の構成を変更する必要はありません。新しい@Configurationクラスを追加するだけです(そのクラスはテストケースと同じファイルに含めることもできます)。 )。

46
wassgren

あなたに遅れたとしても、私はこれを読む他の人を助けるためだけに私の答えを投稿します。

別の解決策は、dataContext.xmlでBeanとしてConfigurationクラスを宣言することです。

あなたがする必要があるのは:

<bean class="com.packageWhereConfigClassIsPresent.Configuration"/>

それが誰かを助けることを願っています;)

3
Aditzu