私は次のテストを書きました:
@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.
設定を書き換えずに修正するにはどうすればよいですか?
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
クラスを追加するだけです(そのクラスはテストケースと同じファイルに含めることもできます)。 )。
あなたに遅れたとしても、私はこれを読む他の人を助けるためだけに私の答えを投稿します。
別の解決策は、dataContext.xmlでBeanとしてConfigurationクラスを宣言することです。
あなたがする必要があるのは:
<bean class="com.packageWhereConfigClassIsPresent.Configuration"/>
それが誰かを助けることを願っています;)