我最近开始考虑使用Robolectric gradle插件来测试我的一个应用程序。插件本身很容易在项目中设置到项目中,但在尝试运行样本测试时我仍然遇到同样的错误。我的代码如下:
我的活动
package com.example.trial.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.my, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void emptyMethod(String empty) {
}
}
我的Robolectric测试
package com.example.trial.myapplication;
import android.app.Application;
import android.test.ApplicationTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class ApplicationTest extends ApplicationTestCase<Application> {
private MyActivity myActivity;
public ApplicationTest() {
super(Application.class);
}
@Before
public void setUp() throws Exception {
myActivity = Robolectric.buildActivity(MyActivity.class).create().get();
}
@SmallTest
public void testSomething() throws Exception {
assertTrue(myActivity != null);
}
}
运行测试应用程序会抛出以下错误,指向setup方法中的代码。
org.fest.reflect.exception.ReflectionError: Unable to find method '$$robo$getData' in com.example.ronand.myapplication.MyActivity with parameter type(s) []
at org.fest.reflect.method.Invoker.lookupInClassHierarchy(Invoker.java:78)
at org.fest.reflect.method.Invoker.createInvoker(Invoker.java:60)
at org.fest.reflect.method.Invoker.newInvoker(Invoker.java:55)
at org.fest.reflect.method.MethodReturnType.in(MethodReturnType.java:66)
at org.robolectric.bytecode.ShadowWrangler.shadowOf(ShadowWrangler.java:434)
at org.robolectric.Robolectric.shadowOf_(Robolectric.java:1034)
at org.robolectric.util.ComponentController.<init>(ComponentController.java:36)
at org.robolectric.util.ActivityController.<init>(ActivityController.java:45)
at org.robolectric.util.ActivityController.<init>(ActivityController.java:41)
at org.robolectric.Robolectric.buildActivity(Robolectric.java:1376)
at com.example.trial.myapplication.ApplicationTest.setUp(ApplicationTest.java:23)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1741)
我遇到了几个问题,表明此错误与Robolectric.shadowOf()
的使用有关,但我不会在代码中的任何位置使用此错误。如果有人能指出我正确的方向,我将非常感激。
谢谢!
答案 0 :(得分:1)
不确定这是否是核心问题,但您将Robolectric与Android的测试框架混合在一起。 Robolectric在JVM上运行测试(它不需要也不使用仿真器/设备)并使用JUnit 4而不是3.
所以你不需要扩展ApplicationTestCase,也不需要扩展构造函数,注释应该是@Test(来自JUnit4),而不是@SmallTest(来自Android测试)。 如果你没有更多来自android.test。*
的导入,你就会知道它是对的如果IDE中出现该选项,还要确保将这些作为JUnit测试运行,而不是Android UI测试。