2016-06-27 7 views
1

私は、Mavenで構築されたライブラリで、Spring 4.0.3.RELEASEとTogglz 2.2.0.Finalを使用しています。私は私の春のクラスのJUnitの4.11テストを書こうとして実行されます最初のテストに次のようなエラーに実行している:ここでプロバイダorg.togglz.slf4j.Slf4jLogProviderはサブタイプではありません

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 

私はMETA-INF/serivces/org.togglz.core.spi.LogProvider

Slf4jLogProviderがLogProviderから割り当て可能でなければならないので、このエラーは不可解である位置SPI経由LogProvider(org.togglz.slf4j.Slf4jLogProvider)を提供しました。申し訳ありませんが、私は完全な画像を試してみたかったのです。 「テスト中」のクラスのコードは、createメソッド内で単一の機能が有効かどうかを確認するための呼び出しを行っています。

答えて

-1

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

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

これは、Togglzを更新してもIDEが古いアーカイブを削除しなかった場合に発生します。クリーンなビルドを実行したり、Eclipseで "Update Maven Configuration"を選択したりすると、この問題が解決されます。

+0

これが私がチェックした最初のものでした。私はさらに私の.m2リポジトリからtogglzを削除し、他のバージョンが導入されていないことを確認するために再構築しました。私はslf4jモジュールを含めて自動的にプロバイダとして追加すると思っていましたが、最初のエラーは "testCreateItem_throwsItemServiceBusinessException .ItemServiceImplTest)経過時間:1.771秒<<< ERROR! java.util.ServiceConfigurationError:org.togglz.core.spi.LogProvider: プロバイダorg.togglz.core.logging.Jdk14LogProviderはサブタイプではありません。意味をなさない –

+0

PowerMockがクラスローダーを混乱させているのだろうか?私はそれがインスツルメント・クラスであることは承知していますが、トグルズ・クラスをインストルメントするべきではありませ –

+0

Hmmm。それは変だ。計装がこれを引き起こしている可能性があります。私はあなたが何がうまくいかないのかを見つけるために、対応するクラスでいくつかのデバッグを試みることができると思います。または、Powermockの有無にかかわらず最小のテストでServiceLoader.load(LogProvider.class)を自分で呼び出そうとする可能性があります。 – chkal

関連する問題