3

我正在使用Green Coffee 库在我的仪器测试中运行 Cucumber 场景。我按照 repo 一步一步提供的示例进行操作,但这是错误:

junit.framework.AssertionFailedError: Class pi.survey.features.MembersFeatureTest has no public constructor TestCase(String name) or TestCase()

当我尝试向这里提供的类添加默认构造函数时,它说

'com.mauriciotogneri.greencoffee.GreenCoffeeTest' 中没有可用的默认构造函数

这是我的测试源代码:

package pi.survey.features;

import android.support.test.rule.ActivityTestRule;

import com.mauriciotogneri.greencoffee.GreenCoffeeConfig;
import com.mauriciotogneri.greencoffee.GreenCoffeeTest;
import com.mauriciotogneri.greencoffee.Scenario;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.io.IOException;

import pi.survey.MainActivity;
import pi.survey.steps.memberSteps;

@RunWith(Parameterized.class)
public class MembersFeatureTest extends GreenCoffeeTest {
    @Rule
    public ActivityTestRule<MainActivity> activity = new ActivityTestRule<>(MainActivity.class);

    public MembersFeatureTest(Scenario scenario) {
        super(scenario);
    }



    @Parameterized.Parameters
    public static Iterable<Scenario> scenarios() throws IOException {
        return new GreenCoffeeConfig()
                .withFeatureFromAssets("assets/members.feature")
                .scenarios();
    }

    @Test
    public void test() {
        start(new memberSteps());
    }

}

我的members.feature消息来源:

Feature: Inserting info to server



  Scenario: Invalid members
          When I introduce an invalid members
          And  I press the login button
          Then I see an error message saying 'Invalid members'
4

2 回答 2

1

只需修复结构即可解决问题。

此提交中的代码详细信息

于 2016-09-18T17:16:44.987 回答
1

关于构造函数的问题。由于GreenCoffee中的测试需要:

@RunWith(Parameterized.class)

带有注解的静态方法@Parameters必须返回一些东西的列表(但不一定是场景)。文档中的示例只是返回一个场景列表,这就是构造函数必须将单个场景作为参数的原因。

但是,您可以创建一个类来封装您可能需要传递给构造函数的场景和其他对象。例如,给定以下类:

public class TestParameters
{
    public final String name;
    public final Scenario scenario;

    public TestParameters(String name, Scenario scenario)
    {
        this.name = name;
        this.scenario = scenario;
    }
}

你可以写:

public TestConstructor(TestParameters testParameters)
{
    super(testParameters.scenario);
}

@Parameters
public static Iterable<TestParameters> parameters() throws IOException
{
    List<TestParameters> testParametersList = new ArrayList<>();

    List<Scenario> scenarios = new GreenCoffeeConfig()
            .withFeatureFromAssets("...")
            .scenarios();

    for (Scenario scenario : scenarios)
    {
        testParametersList.add(new TestParameters(scenario.name(), scenario));
    }

    return testParametersList;
}

通过这种方式,您可以在测试构造函数中接收多个值(封装在一个对象中)。

于 2016-09-21T22:14:17.583 回答