Ah, I see. No, there is no way to do that, JUnit only allows one runner. On Mon, Oct 5, 2015 at 2:14 PM, Rafael Pestano <[email protected]> wrote:
> Hi Jason, > > > The idea is to enable Cucumber in TestControl based tests and not in > current Deltaspike tests. > > Currently we cannot (let me know if there is a way) run a TestControl test > and use cucumber at the same time because both have its own runners, right? > > > > 2015-10-05 17:10 GMT-03:00 Jason Porter <[email protected]>: > > > While I like cucumber and I think it does a good job at helping tests be > > easy to read, I think we'd need a compelling reason to start using it / > > migrating tests. > > > > On Mon, Oct 5, 2015 at 2:06 PM, Rafael Pestano <[email protected]> > > wrote: > > > > > Hi guys, > > > > > > I recently made a small PoC in TestControl module to enable cucumber > > tests > > > using deltapike, here's an example: > > > > > > > > > @RunWith(CdiTestRunner.class) > > > @CucumberOptions( > > > features = "src/test/resources/features/uc014.feature" > > > ) > > > public class CucumberCDITest > > > { > > > > > > > > > @Test > > > public void fakeIt() //needed by junit runner > > > { > > > > > > } > > > > > > > > > } > > > > > > > > > uc014.feature > > > > > > Feature: ApplicationScoped bean test > > > As a user of DeltaSpike Test Control module > > > I want to inject application scoped beans > > > So that I can test application scoped beans > > > > > > > > > Scenario Outline: bean increment > > > Given test bean value is set to <value> > > > When bean value is incremented by 2 > > > Then bean value should be <result> > > > > > > Examples: examples1 > > > | value | result | > > > | 1 | 3 | > > > | 0 | 2 | > > > | 10 | 12 | > > > > > > > > > public class Uc014Steps > > > < > > > > > > https://github.com/rmpestano/deltaspike/blob/master/deltaspike/modules/test-control/impl/src/test/java/org/apache/deltaspike/test/testcontrol/uc014/Uc014Steps.java > > > > > > > { > > > > > > @Inject > > > private ApplicationScopedTestBean testBean; > > > > > > @Inject > > > private ApplicationScopedTestBeanClient testBeanClient; > > > > > > > > > @Given("^test bean value is set to (\\d+)$") > > > public void initBeanValue(int value) { > > > this.testBean.setValue(value); > > > } > > > > > > @When("^bean value is incremented by (\\d+)$") > > > public void incrementBeanValue(int amount) { > > > this.testBeanClient.increment(amount);//will increment bean value > > > } > > > > > > @Then("^bean value should be (\\d+)$") > > > public void checkBeanValue(int result) { > > > Assert.assertEquals(result, this.testBean.getValue()); > > > } > > > > > > @After > > > public void finalCheck() { > > > int value = > > > > > > > > > BeanProvider.getContextualReference(ApplicationScopedTestBean.class).getValue(); > > > int nextValue = > > > > > > > > > BeanProvider.getContextualReference(ApplicationScopedTestBeanClient.class).getNextValue(); > > > > > > if (value == 0) > > > { > > > throw new IllegalStateException("new application-scoped bean > > > instance was created"); > > > } > > > > > > if (nextValue == 1) > > > { > > > throw new IllegalStateException("new application-scoped bean > > > instance was created"); > > > } > > > } > > > > > > > > > } > > > > > > It is working here: https://github.com/rmpestano/deltaspike > > > <https://github.com/rmpestano/deltaspike> and the changes I've made > are > > > in this > > > commit > > > < > > > > > > https://github.com/rmpestano/deltaspike/commit/53a91c4a592afb084c42df6ff023bfc4f1b325f8 > > > > > > > . > > > > > > > > > I did not created another runner, for simplicity i'm running cucumber > > > inside CdiTestRunner, here's relevant bits: > > > > > > @Override > > > public void run(RunNotifier runNotifier){ > > > > > > if > > > > > > (getTestClass().getJavaClass().isAnnotationPresent(CucumberOptions.class)) > > > { > > > > > > testContext.runCucumber(runNotifier,getTestClass()); > > > > > > } > > > > > > else > > > > > > { > > > super.run(runNotifier); > > > } > > > > > > public void runCucumber(RunNotifier runNotifier, TestClass testClass) > > > throws IOException, InitializationError > > > { > > > applyBeforeClassConfig(testClass.getJavaClass()); > > > new Cucumber(testClass.getJavaClass()).run(runNotifier); > > > applyAfterClassConfig(); > > > } > > > > > > > > > I also needed to create an object factory > > > < > > > > > > https://github.com/rmpestano/deltaspike/blob/master/deltaspike/modules/test-control/impl/src/main/java/cucumber/runtime/CucumberObjectFactory.java > > > > > > > in order to make step definitions (like Uc014Steps) CDI beans. This > > factory > > > must be in package 'cucumber.runtime' otherwise Cucumber wont use it (I > > > think there is way to make cucumber load it from other packages but we > > need > > > to create a cucumber backend for it) > > > > > > > > > > > > > > > Do you think this could be incorporated in Test Control module? > > > > > > > > > If you have interest I think we need to create a separated runner and > > then > > > we can get ride of the > > > > > > @Test > > > public void fakeIt() //needed by junit runner > > > { > > > > > > } > > > > > > without the fake test junit runner will complain cause there is no test > > > method. > > > > > > > > > OBS: > > > I needed to declare sure-fire plugin to use a newer version > > > I had to upgrade junit to 4.11 because cucumber-junit depends on it > > > > > > -- > > > <http://www.advancedit.com.br/>Att, > > > > > > Rafael M. Pestano > > > > > > Desenvolvedor Java Cia. de Processamento de Dados do Rio Grande do Sul > > > http://rpestano.wordpress.com/ > > > @realpestano <https://twitter.com/realpestano> > > > > > > > > > > > -- > > Jason Porter > > http://en.gravatar.com/lightguardjp > > > > > > -- > <http://www.advancedit.com.br/>Att, > > Rafael M. Pestano > > Desenvolvedor Java Cia. de Processamento de Dados do Rio Grande do Sul > http://rpestano.wordpress.com/ > @realpestano <https://twitter.com/realpestano> > -- Jason Porter http://en.gravatar.com/lightguardjp
