8

我想结合 Robolectric 和 Cucumber (JVM)。

目前我有两个类ActivityStepdefs,其中定义了活动管理的两个步骤定义。

我的第二个类是RoActivity在哪里,例如从它的类名创建一个活动,以及将在哪里使用 Robolectric。

当我在这个类中RoActivityTest使用测试运行时通过了,但是当我运行(运行特性作为junit测试的类)时,来自的代码没有作为Robolectric的一部分运行,即在我的项目中搜索特性并将其与内部的方法匹配,并且最后这个类将调用一个方法RobolectricTestRunnerRunCukesTestRoActivityRunCukesTestActivityStepdefsRoActivity

是否可以使用两个 junit both* 跑步者进行测试?

我不确定,但也许可以使用 junit 规则来做类似 powermock 的事情。

在那种情况下,我应该为哪一个定义规则?

*黄瓜和Robolectric

4

2 回答 2

0

我的小5美分。

Cucumber 主要用于验收测试(如果您将它用于单元测试,请纠正我),而 Robolectric 主要用于单元测试。

至于我,在 TDD 期间写 cucumber 是大材小用。而且 Robolectric 仍然不是 android,我会在真实设备或至少模拟器上运行验收测试。

于 2015-09-11T05:27:57.630 回答
0

我面临同样的问题,经过一些谷歌工作后,我得到了解决方案:

@RunWith(ParameterizedRobolectricTestRunner::class)
@CucumberOptions( features = ["src/test/features/test.feature","src/test/features/others.feature"], plugin = ["pretty"])
class RunFeatures(val index: Int, val name:String) {

    companion object {
        @Parameters(name = "{1}")
        @JvmStatic
        fun features(): Collection<Array<Any>> {
            val runner = Cucumber(RunFeatures::class.java)
            Cucumber()
            val children = runner.children
            return children.mapIndexed{index, feature ->
                arrayOf(index,feature.name)
            }
        }
    }



    @Test
    fun runTest() {
        val core = JUnitCore()
        val feature = Cucumber(RunFeatures::class.java).children[index]!!
        core.addListener(object: RunListener() {
            override fun testFailure(failure: Failure?) {
                super.testFailure(failure)
                fail("$name failed:\n"+failure?.exception)
            }
        })
        val runner = Request.runner(feature)
        core.run(runner)
    }
}

但对我来说似乎不是一个很好的解决方案,有人可以帮我解决这些问题:

  1. 必须明确列出所有功能文件路径。但不能使用 *.feature 等模式
  2. 失败时无法知道哪一步失败。
  3. 参数只能传递原始类型数据,

我已经进入黄瓜源,但似乎 CucumberOptions 内联黄瓜,我不能以编程方式传递它,但只能使用注释。

于 2020-03-08T04:13:04.030 回答