0

私のIDE(intelliJ)は、「WebApplicationContextタイプのBeanが見つかりませんでした」と不平を言い、テストを実行するとmockMvcの作成中に失敗します。

"ClassNotFoundException:org.springframework.web.context.request.async.CallableProcessingInterceptor

何が欠けているべきか?

テスト アプリケーションのコンテキスト ファイルは次のようになります。

<context:annotation-config />
<mvc:annotation-driven />
<context:property-placeholder location="
        file:src/main/resources/conf/${user.name}/my.properties,
        file:src/main/resources/conf/${user.name}/my-junit.properties"/>

<context:component-scan base-package="my.main.package"/>

<import resource="classpath:META-INF/SomeOtherContext.xml"/>

そして、これが私のテストクラスの外観です。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration({
   "file:/src/test/resources/META-INF/MyTestContext.xml"
})

public class ServiceTest {

  @Autowired
  private WebApplicationContext context;

@Before
public void init() throws NoSuchFieldException {

    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();

}


}

そして、POMファイルは次のようなものです(以下は、コンテンツを表示するための親と子のPOMの組み合わせです);

  <dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
    </dependency>


    <dependency>
        <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-jsp</artifactId>
    </dependency>

    <dependency>
        <groupId>org.jibx</groupId>
        <artifactId>jibx-run</artifactId>
    </dependency>

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>

    <dependency>
        <groupId>com.sybase</groupId>
        <artifactId>jconnect</artifactId>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>

    <dependency>
        <groupId>junit-addons</groupId>
        <artifactId>junit-addons</artifactId>
    </dependency>

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-mock</artifactId>
    </dependency>


    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
    </dependency>

    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-all</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>3.1.1.RELEASE</version>
    </dependency>

親 Pom は ;

   <properties>
    <project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
    <schema.dir>src/main/resources/xsd</schema.dir>
    <spring.version>3.1.1.RELEASE</spring.version>
    <spring.security.version>3.1.3.RELEASE</spring.security.version>
    <slf4j.version>1.6.4</slf4j.version>
    <jconnect.version>6.0</jconnect.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>${spring.security.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-core</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-aop</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-beans</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-expression</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-web</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-jdbc</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-tx</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>${spring.security.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-asm</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-beans</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-core</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-aop</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>


        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>tiles-jsp</artifactId>
            <version>2.2.2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-nop</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>jcl-over-slf4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.jibx</groupId>
            <artifactId>jibx-run</artifactId>
            <version>1.2.4.5</version>
            <exclusions>
                <exclusion>
                    <!-- xpp3 dependency includes a core javax.xml.namespace.QName class -->
                    <groupId>xpp3</groupId>
                    <artifactId>xpp3</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.12</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.4</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>com.sybase</groupId>
            <artifactId>jconnect</artifactId>
            <version>${jconnect.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.1.6.Final</version>
        </dependency>

        <dependency>
            <artifactId>jboss-logging</artifactId>
            <groupId>org.jboss.logging</groupId>
            <version>3.1.0.GA</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>junit-addons</groupId>
            <artifactId>junit-addons</artifactId>
            <version>1.4</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.9.5</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-mock</artifactId>
            <version>2.0.8</version>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>3.2.0.RELEASE</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-all</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
4

2 に答える 2

3

これをデバッグする最初のステップ: クラスをリソースとしてロードする単体テストを作成します。

 @Test
 public void testClassLoading() {
     Enumeration<URL> urls = getClass().getClassLoader().getResources("org/springframework/web/context/request/async/CallableProcessingInterceptor.class");
     int count = 0;
     while( urls.hasMoreElements() ) {
         System.out.println( urls.nextElement() );
         count ++;
     }
     assertEquals( "Expected this class exactly once", 1, count );
 }

単純なクラスパスの問題 (依存関係の重複または欠落) を防ぐために、単体テストにこれらをいくつか使用しています。

注: これは、スタンドアロンの単体テスト クラスである必要があります。Spring が初期化に失敗した場合、テスト メソッドを実行できない可能性があります。

テストが 0 を返すことがわかりました。これは、クラスがクラスパスにないことを意味します。

2 番目のステップは、このクラスを含む JAR を見つけることです。http://search.maven.org/#advancedsearch%7Cgav に移動、正しいフィールドにクラス名を入力します。

検索の結果、このクラスは 3.1 にorg.springframework:spring-web:jar:3.2.x.RELEASEあり、3.1 にはないことがわかりました。

結論: クラスパスに何か問題があります。おそらくSpringバージョンを混在させます。そうしないでください。

于 2013-09-16T14:14:09.117 に答える
2

親POMが追加された後の2番目の回答

親 POM は複数のバージョンの Spring Framework を取り込みます。具体的には:

親 POM:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-mock</artifactId>
    <version>2.0.8</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <artifactId>commons-logging</artifactId>
            <groupId>commons-logging</groupId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>3.2.0.RELEASE</version>
    <scope>test</scope>
</dependency>

プロジェクトPOM

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>

フレームワーク ライブラリのバージョンを混在させることはできません。

元の回答

アーロンの答えは、デバッグに非常に役立ちます。欠落しているクラスが 3.1 に含まれているかどうか確信が持てなくなったため、上記の M. Deinum のコメントも非常に関連性がある可能性があります。3.2がリリースされるまで見つかりません。デバッグ中にバージョンをいじったために、jar が競合している可能性があります。

おそらく、「mvn clean」を試してから、「mvn dependency:copy-dependencies ormvn package」を試してください。次に、maven が必要と判断した jar ファイルの完全なリストを確認できます。特に、Spring ライブラリのバージョンの不一致または重複を確認してください。

質問の冒頭でIDEの使用について言及しています。おそらく、IDE は、テストの実行時にクラスパスの完全な Maven 依存関係リストを使用するように構成されていません。

于 2013-09-16T14:33:41.320 に答える