0

Maven/Eclipse を使用して Java でプログラミングしています。

単体テストから実行すると、HtmlUnit を正常に実行できます。(テスト/)

ただし、src/ フォルダーで同じコードを使用しようとすると、java.lang.NoClassDefFoundErrorメッセージが表示されます。それらを解決できた唯一の方法は、すべての jar を手動でビルド パスに追加することです。しかし、jarファイルが私のMaven依存関係に表示されるので、これは私には意味がありません。

pom.xml (実際の pom ファイルにはさらに依存関係があります)

<dependency>
    <groupId>net.sourceforge.htmlunit</groupId>
    <artifactId>htmlunit</artifactId>
    <version>2.9</version>
    <scope>test</scope>
</dependency>

HtmlUnit コードのサンプル ブロック

WebClient webClient = new WebClient();
HtmlPage page = webClient.getPage(url);
System.out.println("Executing Pages JavaScript for " + config.executeJavaScriptTime + " seconds...");                       webClient.waitForBackgroundJavaScript(config.executeJavaScriptTime);
dom = cleaner.clean(page.asXml());
html = cleaner.getInnerHtml(dom);
webClient.closeAllWindows();

何か案は?ありがとう。

4

2 に答える 2

2

依存関係に適用されるテスト スコープは、コンパイル クラスパスで使用できないことを意味します。このように、出荷するコードはテスト コードに依存しません。より完全な説明については、こちらを参照してください。ビルドしているプロジェクトがテストのみを目的としている場合は、scope タグを削除して、デフォルトのスコープである compile を使用できるようにする必要があります。しかし、一般的には、src からビルドされた出荷コードは、テスト ライブラリである JUnit に依存すべきではないというのは正しいことです。

于 2012-05-30T01:04:00.903 に答える
0

今のところ、私が見つけた唯一の実用的なハックは、 という注釈が付けられたメソッドを作成し@Test、クローラーを JUnit テストとして実行することです。

すなわち

public class Crawler() {

    @Test
    public void runAsTest() {
        Crawler crawler = new Crawler();
        String[] urls = new String[]{
                "http://www.url.com/1",
                "http://www.url.com/2",
                "http://www.url.com/3"
            };
        crawler.crawl(urls);
        try {
            Thread.sleep(1000 * 60 * 15); // without this the unit test exits too early
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

  // the rest of the class definition

}

これを標準の main メソッドから実行できるようにしたいと思います。

public class Crawler() {

    public static void main(String[] args) {
        Crawler crawler = new Crawler();
        String[] urls = new String[]{
                "http://www.url.com/1",
                "http://www.url.com/2",
                "http://www.url.com/3"
            };
        crawler.crawl(urls);
        try {
            Thread.sleep(1000 * 60 * 15); // without this the unit test exits too early
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

  // the rest of the class definition

}
于 2012-05-30T01:03:50.777 に答える