2

EclipseでRobolectricを使用して簡単なテストを実行しようとしています。私はこのチュートリアルに従いましたが、このエラーが発生しました:

java.lang.RuntimeException:java.io.FileNotFoundException:C:\ Vishal \ Development \ ワークスペース>\AndroidHelloWorldTester。\AndroidManifest.xmlが見つからないか、ファイルがありません。>プロジェクトのAndroidManifest.xmlを指す必要があります

次に、ここでのEugenのアドバイスに従って、ここで指示されているようにRobolectricTestRunnerクラスを拡張しようとしましたが、このエラーが発生しました:-(コンパイルエラーが発生したため、コンストラクターを指示どおりに正確に記述できませんでした)

java.lang.Exception:テストクラスには、パブリックゼロ引数コンストラクターが1つだけ含まれている必要があります

現在これはクラスです:-

package com.myTest;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.model.InitializationError;

import android.widget.Button;
import android.widget.TextView;

import com.visd.helloworld.AndroidHelloWorldActivity;
import com.visd.helloworld.R;
import com.xtremelabs.robolectric.RobolectricTestRunner;

@RunWith(RobolectricTestRunner.class)
public class Ahtest extends RobolectricTestRunner {

    public Ahtest(Class AndroidHelloWorldActivity) throws InitializationError {
    super(AndroidHelloWorldActivity, "<the project root location>");
    // TODO Auto-generated constructor stub
}

    private Button pressMeButton;
    private TextView results;
    AndroidHelloWorldActivity activity;
    @Before
    public void setUp() throws Exception {
        activity = new AndroidHelloWorldActivity();

        activity.onCreate(null);
        pressMeButton = (Button) activity.findViewById(R.id.mybut1);
        results = (TextView) activity.findViewById(R.id.text1);
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void testSomethingMeaningfulToMyApp() {
         pressMeButton.performClick();
         String resultsText = results.getText().toString();
         assertThat(resultsText, equalTo("Button Clicked"));
    }

}

PN:
1)アプリケーションとテストで異なるプロジェクトを作成しました。
2)指定した場合、指定したとおりにコンストラクターを記述できませんでした:-

super(testClass、new File( "../ other / project-root"));

コンパイルエラーが発生します。助けてください。

4

1 に答える 1

1

ヴィシャール、

テストクラスとランナークラスを混在させています。

junitは一般的に次のように機能します。

for (TestClass c: allTests) {
    Test t = TestClass.newInstance();

    testListener.startTest(t.getName());
    try {
       t.beforeTest();
       t.run();
       t.afterTest();

       testListener.testPass(t.getName());
    } catch (Exception e) {
       if (t.isExpectedException(e)) {
           testListener.testPass(t.getName());
       } else if (isAssertException(e)) {
           testListener.testFail(t.getName(), getExplanation(e));
       } else {
           testListener.testError(t.getName(), e);
       }
    }

    testListener.testEnd(t.getName());
}

メソッド呼び出しのためClass.newInstance()、テストクラスのパブリック非ゼロパラメータコンストラクタが必要です。アノテーション@Test@Beforeおよびどのクラスがテストクラスであるかをjunit@Afterにマークします。

上記のコードは一種のテストランナークラスです。テストランナークラスから追加のロジックが必要になる場合があります。たとえば、RobolectricPowerMockは、標準のClassLoaderを目的に応じた独自のClassLoaderに置き換えています。Androidクラスに独自の実装を提供するRobolectric 。PowerMockは、静的な最終クラスとメソッドをモックする機能、およびクラスコンストラクターをモックする機能を備えています。

@RunWithテストクラスに別のテストランナーを使用する必要があることをjunitに通知するためのアノテーションが存在します。したがって、RobolectricAndroidテストにはが必要@RunWith(RobolectricTestRunner.class)です。ただし、クラスを拡張することにより、 Robolectricテストランナーに機能を追加することができますRobolectricTestRunner。たとえば、独自のシャドウイングや特定のAndroidManifest.xmlファイルを指す場合です。

したがって、 Robolectricを特定のマニフェストファイルの場所にAHTesRunnerポイントする独自のテストランナークラスを用意する必要があります。

public class AHTestRunner extends RobolectricTestRunner {}

そして、独自のテストランナー(カスタマイズされたRobolectricテストランナー)を使用する必要があることをjunitに通知する必要があります。

@RunWith(AHTestRunner.class)
public class AHTest {
    @Before
    ......
    @Test
    ......
    @After
}

これが今はっきりしていることを願っています

于 2012-12-25T21:21:35.760 に答える