是否可以使用Robolectric测试抽象活动

时间:2013-09-01 13:32:50

标签: android junit robolectric android-testing

我在代码中使用抽象活动类,从活动类中抽象出一些功能。

我正在尝试使用Robolectricgradle-android-test-plugin使用扩展抽象类的子类来测试抽象活动类。我似乎无法让它工作。

有没有人在这方面有任何经验,甚至可能吗?基本结构是:

@RunWith(RobolectricGradleTestRunner.class)
public class AbstractActivityTest {
    private ActivityTest activity;

    @Before
    public void setUp() throws Exception {
        activity = Robolectric.buildActivity(ActivityTest.class).create().get();
    }


    private class ActivityTest extends AbstractActivity {
        // do something
    }
}

最初,我收到了子类不是静态的错误消息,所以我把它设为静态。现在我得到以下两个失败:

initializationError FAILED
java.lang.Exception: Test class should have exactly one public constructor

initializationError FAILED
java.lang.Exception: No runnable methods

我在@Test方法中进行的任何明显真实的测试都会成功。

3 个答案:

答案 0 :(得分:5)

第一个错误,表示您将非默认构造函数添加到测试类或更改了默认构造函数的访问级别。但正如它所说junit测试类应该至少有一个公共构造函数。

第二个说测试类中至少有一个方法应该有@Test注释(junit 4)或者以测试子字符串(junit 3)开头。

答案 1 :(得分:3)

哟可以完全按照你要做的去做:将抽象活动子类化并实例化具体类。

但是,您需要在其自己的公共文件中声明扩展抽象Activity的类。如果它是嵌套类,Robolectric将无法实例化。

我不知道为什么。

答案 2 :(得分:0)

我用这种方式测试抽象活动:

<强> 1。创建抽象活动:

public abstract class AbstractActivity extends AppCompatActivity {

    public int getNumber() {
        return 2;
    }
}

<强> 2。创建测试类:
您只需要声明抽象类的 static 嵌套子类。

@RunWith(RobolectricTestRunner.class)
public class AbstractActivityTest {

    @Test
    public void checkNumberReturn() throws Exception {
        TestAbstractActivity testAbstractActivity = Robolectric.setupActivity(TestAbstractActivity.class);
        assertThat(testAbstractActivity.getNumber(), is(2));
    }

    public static class TestAbstractActivity extends AbstractActivity {
    }
}