8

これを重複としてマークする前に、まず質問を読んでください。私はこの例外に関するすべてのものを読みましたが、それは私にとって問題を解決しません。Another CacheManager with same name 'myCacheManager' already existsそして、たとえばの代わりに、わずかに異なる例外が発生しAnother unnamed CacheManager already existsます。

春の設定:

<cache:annotation-driven cache-manager="cacheManager"/>

<bean id="cacheManager"
      class="org.springframework.cache.ehcache.EhCacheCacheManager"
      p:cacheManager-ref="ehcache"/>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
      p:configLocation="ehcache.xml"
      p:cacheManagerName="myCacheManager"
      p:shared="true"/>

ehcache

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
        updateCheck="false" name="myCacheManager">

</ehcache>

問題は、セキュリティをテストするテストクラスが1つ(将来的にはもっと)あることです。これらのクラスは、SecurityContext.xmlもロードします

したがって、ほとんどのテストクラスには次のアノテーションがあります。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:ApplicationContext.xml")

ただし、問題の原因となっているクラス:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
    "classpath:ApplicationContext.xml",
    "classpath:SecurityContext.xml"
})

場所が異なるため、コンテキストが再度読み込まれるようですが、ehcacheManagerは以前のテストからまだアクティブです。

注:これは、複数のテストを実行している場合にのみ発生します(たとえば、クリーン+ビルドなど)。このテストクラスを個別に実行すると、完全に正常に機能します。

問題は何ですか?どうすれば解決できますか?

4

4 に答える 4

8

テストクラスにアノテーションを追加@DirtiesContextします。

@ContextConfiguration(...)
@RunWith(...)
@DirtiesContext // <== add e.g. on class level
public class MyTest {
    // ...
}

このアノテーションは、テストに関連付けられているアプリケーションコンテキストがダーティであり、閉じる必要があることを示しています。後続のテストには、新しいコンテキストが提供されます。クラスレベルとメソッドレベルで動作します。

于 2013-02-23T12:14:31.347 に答える
7

質問/問題がまだ関連しているかどうかはわかりませんが、ここに簡単で適切な解決策があります(すべてのテストで@DirtiesContextを追加する必要はありません)。@DirtiesContextを回避すると、すべての統合テストに対して1つの共有コンテキストのみを持つことができます(たとえば、mavenによって実行するか、IDEですべてのテストを実行します)。これにより、同時に開始された複数のコンテキストによって引き起こされる複数の問題を回避できます。

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
  p:configLocation="ehcache.xml"
  p:cacheManagerName="myCacheManager"
  p:shared="${ehcacheManager.shared:true}"
  p:acceptExisting:"${ehcacheManager.acceptExisting:false}"/>

テスト(統合テスト)では、これらのプロパティを設定します

ehcacheManager.acceptExisting=true
ehcacheManager.shared=false

これにより、SpringはテストごとにEhcacheManager(ehcache)を作成できますが、同じ名前のEhcacheManagerが存在する場合、Springはそれを再利用します。また、Springは、@DirtiesContextで注釈が付けられたコンテキストでそれを破棄/シャットダウンしません。

考え方は単純です。@DirtiesContextを使用すると、EhcacheManagerの破棄を防ぐことができます。

Spring 4とEhCache:2.5+を使用している場合に適用されます。Spring 3では、これら2つのプロパティを追加するには、EhCacheManagerFactoryBeanを拡張する必要があります。

各テストの前にキャッシュをクリアすることを忘れないでください:)

于 2015-11-30T12:23:28.933 に答える
4

コードに@Cacheableアノテーションを持つメソッドがある場合でも、キャッシュを無効にしてテストを実行できます。

そうすれば、すべてのテストに@DirtiesContextのマークを付けて、テストの実行を遅くする必要がありません。

キャッシュ関連のSpring構成を独自のSpring構成ファイルに入れます。applicationContext-cache.xmlファイル。

そのapplicationContext-cache.xmlファイルは、アプリケーションをライブで実行する場合にのみ含めてください。テストには含めないでください。

特にキャッシングをテストする場合は、@DirtiesContextアノテーションが必要です。

于 2014-06-25T06:02:03.483 に答える
1

これは、テスト中に複数のSpringアプリケーションコンテキストが同時に存在するために発生します。ただし、ehcacheはJVMグローバルです。

spring.propertiesクラスパスにファイルを作成することで、基本的にSpringコンテキストキャッシュを無効にできます。

spring.test.context.cache.maxSize=1

コンテキストが破棄されたときに、キャッシュマネージャーが適切に登録解除されていることを確認してください。

于 2019-08-12T09:19:53.467 に答える