2

Spring 4.0.3.RELEASE と Togglz 2.2.0.Final を使用する Maven で構築されたライブラリがあります。Spring クラスの JUnit 4.11 テストを作成しようとしていますが、実行される最初のテストで次のエラーが発生します。

testCreateItem_throwsItemServiceBusinessException(impl.ItemServiceImplTest)  Time elapsed: 1.771 sec  <<< ERROR!
java.util.ServiceConfigurationError: org.togglz.core.spi.LogProvider: 
Provider org.togglz.slf4j.Slf4jLogProvider not a subtype

関連する Java テスト スニペットは次のとおりです。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class, loader = AnnotationConfigContextLoader.class)
@PrepareForTest({ ItemServiceImpl.class })
public class ItemServiceImplTest {
   @Rule
   public TogglzRule togglzRule = TogglzRule.allDisabled(Features.class);

   @Rule
   public PowerMockRule powerMockRule = new PowerMockRule();

   @Test(expected = ItemServiceBusinessException.class)
   public void testCreateItem_throwsItemServiceBusinessException() throws Exception {
      PowerMockito.doReturn(mockMetricsData).when(serviceUnderTest, START_METRICS_METHOD_NAME, any(MetricsOperationName.class), any(RequestContext.class));

      when(mockDao.createItem(any(Item.class), any(RequestContext.class))).thenThrow(dataBusinessException);

      serviceUnderTest.createItem(item, context);

      verify(mockItemServiceValidator).validate(any(Item.class), any(RequestContext.class));

      PowerMockito.verifyPrivate(serviceUnderTest).invoke(START_METRICS_METHOD_NAME, any(MetricsOperationName.class), any(RequestContext.class));

      verify(mockDao).createItem(any(Item.class), any(RequestContext.class));
   }
}

後続のテスト呼び出しでは、次のエラーが発生します。

java.lang.NoClassDefFoundError: Could not initialize class org.togglz.junit.TogglzRule

ここに私が持っているいくつかの関連する依存関係があります:

 org.mockito:mockito-all=org.mockito:mockito-all:jar:1.9.5:compile,
 org.powermock:powermock-module-junit4=org.powermock:powermock-module-junit4:jar:1.5.6:test,org.powermock:powermock-module-junit4-common=org.powermock:powermock-module-junit4-common:jar:1.5.6:test,
 org.powermock:powermock-reflect=org.powermock:powermock-reflect:jar:1.5.6:test,
 org.powermock:powermock-api-mockito=org.powermock:powermock-api-mockito:jar:1.5.6:test,
 org.powermock:powermock-api-support=org.powermock:powermock-api-support:jar:1.5.6:test,
 org.powermock:powermock-module-junit4-rule=org.powermock:powermock-module-junit4-rule:jar:1.5.6:test,
 org.powermock:powermock-classloading-base=org.powermock:powermock-classloading-base:jar:1.5.6:test,
 org.powermock:powermock-core=org.powermock:powermock-core:jar:1.5.6:test,
 org.powermock:powermock-classloading-xstream=org.powermock:powermock-classloading-xstream:jar:1.5.6:test,
 org.togglz:togglz-core=org.togglz:togglz-core:jar:2.2.0.Final:compile,
 org.togglz:togglz-slf4j=org.togglz:togglz-slf4j:jar:2.2.0.Final:compile,
 org.togglz:togglz-spring-core=org.togglz:togglz-spring-core:jar:2.2.0.Final:compile,
 org.togglz:togglz-testing=org.togglz:togglz-testing:jar:2.2.0.Final:test,
 org.togglz:togglz-junit=org.togglz:togglz-junit:jar:2.2.0.Final:test

org.togglz.slf4j.Slf4jLogProviderそして、SPI 経由で LogProvider ( ) を提供しました。META-INF/serivces/org.togglz.core.spi.LogProvider

Slf4jLogProvider は LogProvider から割り当て可能である必要があるため、このエラーは不可解です。冗長で申し訳ありませんが、全体像を示してみたかったのです。クラス「テスト中」のコードは、create メソッド内で単一の機能が有効になっているかどうかを確認するために呼び出しを行っています。

4

1 に答える 1

-1

まず第一に、アプリケーションでログ プロバイダーを構成する必要はありません。togglz-slf4jこの jar には対応する SPI ファイルが含まれているため、アプリケーション パスに含めるだけで十分です。

クラスパスに複数の競合するバージョンの Togglz JAR ファイルがあるかどうかを確認していただけますか? たとえば、togglz-core-2.2.0.Final.jarwith を一緒に使用するとtogglz-slf4j-2.1.0.Final.jar、次のようなエラーが発生する可能性があります。

これは、Togglz を更新し、IDE が古いアーカイブを削除しなかった場合に発生する可能性があります。クリーン ビルドを実行するか、Eclipse で [Maven 構成の更新] を選択すると、この問題が修正されます。

于 2016-06-28T05:38:08.713 に答える