Я хочу начать использовать Robolectric и RoboGuice в своих Android-приложениях. Пока я добиваюсь удовлетворительных результатов с помощью Robolectric, я застрял на RoboGuice. Я создал небольшое Android-приложение для экспериментов. Это только одно действие, внедряющее кнопку и устанавливающее ее OnClickListener. В соответствующем тестовом классе я хочу внедрить это действие, чтобы иметь возможность протестировать кнопку. Я пробовал много вещей, которые нашел в Интернете, но ничего из этого не сработало, поэтому я попробую здесь. Вот код:
Основная активность.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 не работает? Где недостающая ссылка?
Спасибо.