3

Android アプリで Robolectric と RoboGuice の使用を開始したいと考えています。Robolectric を使用して満足のいく進歩を遂げていますが、RoboGuice を使用して行き詰まっています。実験用の小さな Android アプリを作成しました。Button を注入し、その OnClickListener を設定する、1 つのアクティビティのみです。関連する Test-Class で、このアクティビティを注入して、ボタンをテストできるようにしたいと考えています。インターネットで見つけた多くのことを試しましたが、どれもうまくいかなかったので、ここで試してみます. ここにいくつかのコードがあります:

MainActivity.java:

package com.example.TrialApp;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import roboguice.activity.RoboActivity;
import roboguice.inject.InjectView;

public class MainActivity extends RoboActivity implements View.OnClickListener {

    @InjectView(R.id.main_LoginButton) private Button loginButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        loginButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        SharedPreferences.Editor editor;
        if (view.getId() == R.id.main_Login_Button)
            Log.i("Login-Button pressed... ", "");
    }
}

CustomRobolectricTestRunner.java:

package com.example.TrialApp;

import com.xtremelabs.robolectric.RobolectricTestRunner;
import org.junit.runners.model.InitializationError;

import java.io.File;
public class CustomRobolectricTestRunner extends RobolectricTestRunner {
    public CustomRobolectricTestRunner(Class testClass) throws InitializationError {
        // defaults to "AndroidManifest.xml", "res" in the current directory
        super(testClass, new File("TrialApp"));
    }
}

MainActivity_Test.java:

package com.example.TrialApp;

import com.google.inject.Inject;
import com.xtremelabs.robolectric.Robolectric;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.assertNotNull;

@RunWith(CustomRobolectricTestRunner.class)
public class MainActivity_Test {

    @Inject MainActivity mainActivity;
    @Inject ClassWithoutAName classWithoutAName;

    @Before
    public void setUp() {

    }

    @Test
    public void mainActivityShouldNotBeNull() {
        assertNotNull(mainActivity);
    }

    @Test
    public void classWithoutANameShouldNotBeNull() {
        assertNotNull(classWithoutAName);
    }
}

classWithoutAName は、内容のない非アクティビティ クラスです。非アクティビティクラスを注入するためだけに追加しました。

Test-Class を実行すると、両方のテストが失敗し、次のエラーが発生します。

java.lang.AssertionError
at com.example.TrialApp.MainActivity_Test.mainActivityShouldNotBeNull(MainActivity_Test.java:33) <8 internal calls>
at com.xtremelabs.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:288) <16 internal calls>

java.lang.AssertionError
at com.example.TrialApp.MainActivity_Test.classWithoutANameShouldNotBeNull(MainActivity_Test.java:38) <8 internal calls>
at com.xtremelabs.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:288) <16 internal calls>

明らかに何かが欠けています。MainActivity への注入は正常に機能し、アプリは実行されています。
Robolectric-Testclass で依存関係を注入する同じパターンが機能しないのはなぜですか? ミッシングリンクはどこですか?
ありがとうございました

4

1 に答える 1