I 'inherited' the tests with the recent failures and the departure of the
original author.  We are still on 3.1.2 as some of the tests fail when we
upgrade to anything newer than that.  What I've heard is that the tests
used to run fine on 2.x and then required some hacks to get working on
3.1.2 as 3.x apparently initializes data and tests differently.

What I have done is to wrap the stories in something similar to the
TraderStoryRunner example, remove the maven plugin calls and have it
execute as part of the junit tests.  Doing this the same tests that pass
using 3.1.2 via maven, fails.

The story file for this specific test is 2430 lines of text, about 21000+
JBehave steps.  I will try to give as much relevant information as I can,
but due to the commercial nature of the software I'm limited as to what I
can share.

I have the following base class which is supposed to set up the JBehave
specifics:

import static org.jbehave.core.io.CodeLocations.codeLocationFromClass;

import java.util.List;
import java.util.Properties;

import org.jbehave.core.configuration.Configuration;
import org.jbehave.core.configuration.MostUsefulConfiguration;
import org.jbehave.core.embedder.Embedder;
import org.jbehave.core.embedder.EmbedderControls;
import org.jbehave.core.io.StoryFinder;
import org.jbehave.core.parsers.RegexPrefixCapturingPatternParser;
import org.jbehave.core.reporters.CrossReference;
import org.jbehave.core.reporters.Format;
import org.jbehave.core.reporters.StoryReporterBuilder;
import org.jbehave.core.steps.InjectableStepsFactory;
import org.jbehave.core.steps.InstanceStepsFactory;
import org.jbehave.core.steps.SilentStepMonitor;

public class BaseJBehaveRunner
{
protected void testJBehaveStory(String story_name, Object... steps)
{
Embedder embedder = createEmbedder();
setStepsFactory(embedder, steps);
List<String> storyPaths = new StoryFinder().findPaths(
codeLocationFromClass(this.getClass()), "**/" + story_name,"");
System.out.println (storyPaths);
try
{
embedder.runStoriesAsPaths(storyPaths);
}
finally
{
embedder.generateCrossReference();
}
}
 private void setStepsFactory(Embedder embedder, Object... steps)
{
InjectableStepsFactory factory = new InstanceStepsFactory(
embedder.configuration(),
steps);
embedder.useStepsFactory(factory);
// embedder.useCandidateSteps(factory.createCandidateSteps());
// embedder.reportMatchingStepdocs("Given WAREHOUSE receipt offset
handling");
}
 private Embedder createEmbedder()
{
Embedder embedder = new Embedder();
        Properties rendering = new Properties();
        rendering.put("decorateNonHtml", "true");
        Configuration configuration = new MostUsefulConfiguration()
        .useStoryReporterBuilder(new StoryReporterBuilder()
            .withDefaultFormats()
            .withViewResources(rendering)
            .withFormats(Format.TXT, Format.HTML, Format.XML)
            .withFailureTrace(false)
            .withCrossReference(new CrossReference()))
        .useStepMonitor(new SilentStepMonitor())
        .useStepPatternParser(new RegexPrefixCapturingPatternParser("%"));

        embedder.useConfiguration(configuration);

        EmbedderControls controls = new EmbedderControls().
    doIgnoreFailureInStories(true).
    doBatch(false).
    doIgnoreFailureInView(false).
    doGenerateViewAfterStories(true);

        embedder.useEmbedderControls(controls);

return embedder;
}
}

This is extended by the actual test.  The @SuppressStaticInitializationFor
is necessary to bypass a library's need to load a windows dynamic library.
 This library is used through the code to perform error and event logging
so it is too difficult to code around:

import org.junit.Test;
import org.junit.runner.RunWith;
import
org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
import org.powermock.modules.junit4.PowerMockRunner;

import
postilion.services.extract.ssb.clearance.integration.ach.scenarios.steps.CompanyNameSteps;
import
postilion.services.extract.ssb.clearance.integration.ach.scenarios.steps.EffectiveDateSteps;

@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor({"postilion.office.OfficeLib"})
public class TestCompanyNameJBehave extends BaseJBehaveRunner
{
 @Test
public void testCompanyNameStory()
{
testJBehaveStory("company_name.story", new CompanyNameSteps());
}
 @Test
public void testEffectiveDateStory()
{
testJBehaveStory("effective_date.story", new EffectiveDateSteps());
}
}

The code implementing the steps uses a @BeforeStory method to initialize
the data used in the tests.  It also has a @BeforeScenario that clears some
of the data before every scenario.  The different @Given methods will set
values on the instance data, the @When method will execute business logic
on the actual instance data and store the results.  The @Then methods will
depending on the parameters passed in, perform some actions on the results
and then do JUnit and hamcrest assertions on it.

It would appear that when jbehave is upgraded or when I move to the maven
agnostic junit implementation, that the actual initialization of the data
changes for some tests and the logic now operates on different input data.

Please let me know if you need any more information or more of the code.

Alwyn Schoeman



On Sat, Sep 29, 2012 at 6:07 AM, Mauro Talevi <mauro.tal...@aquilonia.org>wrote:

> Can you provide a sample project showing what you're trying to achieve?
>
> In general, keep in mind that JBehave does not aim to do unit-level
> testing and mocking.   The maven plugin is a completely independent way of
> running the stories from say the JUnit framework.
>
> Moreover, any reason why you're still on 3.1.2 and not upgrading to the
> latest stable version?
>
> Cheers
>
>
> On 28/09/2012 21:34, Alwyn Schoeman wrote:
>
>> Hi everyone,
>>
>> I need to use Powermock to suppress static initialization of some classes
>> used by my JBehave tests.  Currently the tests are executed by using the
>> run-as-embeddables goal of the maven plugin.
>>
>> Have tried just adding the @RunWith(PowerMockRunner.**class) to the
>> existing stories that extend JUnitStory with no success.
>>
>> Have tried removing the maven plugin dependency and embedding the stories
>> in standard JUnit tests that is then executed by Surefire.  This works as
>> far as PowerMockRunner goes, but for some reason result in some test
>> failures.
>>
>> These same test failures also happen when I upgrade the jbehave core from
>> the current 3.1.2 to 3.6.9.
>>
>> I did not write the stories, they are very complex and I don't know if
>> these failures with newer jbehave versions are due to the specific tests
>> being faulty or not.
>>
>> Is there a way that I can introduce PowerMockRunner into the equation
>> while still using the Maven jbehave plugin and version 3.1.2 of jbehave?
>>
>> Regards,
>> Alwyn Schoeman
>>
>>
>
> ------------------------------**------------------------------**---------
> To unsubscribe from this list, please visit:
>
>    
> http://xircles.codehaus.org/**manage_email<http://xircles.codehaus.org/manage_email>
>
>
>

Reply via email to