2014-08-31 5 views
0

Я новичок в JBehave, и я пытаюсь использовать JBehave-JUnit-Runner для хорошего отображения результатов теста в JUnit в Eclipse Luna (на Ubuntu 12.04). Я использую JBehave-JUnit-Runner 1.1.2, JUnit 4.12-beta-1 и JBehave-core 4.0-beta-9. Когда я нажимаю правой кнопкой мыши на свой файл истории и «Запускаю как тест JUnit», все хорошо. Однако, когда я поставил @RunWith (JUnitReportingRunner.class) в верхней части моего рассказа класса, как требуется для JBehave-JUnit-Runner, я получаю следующее сообщение об ошибке:JBehave-Junit-Runner throwing NullPointerException

java.lang.RuntimeException: java.lang.NullPointerException 
at de.codecentric.jbehave.junit.monitoring.JUnitReportingRunner.run(JUnitReportingRunner.java:80) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: java.lang.NullPointerException 
at de.codecentric.jbehave.junit.monitoring.JUnitScenarioReporter.afterStory(JUnitScenarioReporter.java:114) 
at org.jbehave.core.reporters.DelegatingStoryReporter.afterStory(DelegatingStoryReporter.java:49) 
at org.jbehave.core.reporters.ConcurrentStoryReporter.afterStory(ConcurrentStoryReporter.java:120) 
at org.jbehave.core.embedder.PerformableTree.performBeforeOrAfterStories(PerformableTree.java:399) 
at org.jbehave.core.embedder.StoryManager.performStories(StoryManager.java:102) 
at org.jbehave.core.embedder.StoryManager.runStories(StoryManager.java:93) 
at org.jbehave.core.embedder.StoryManager.runStoriesAsPaths(StoryManager.java:74) 
at org.jbehave.core.embedder.Embedder.runStoriesAsPaths(Embedder.java:204) 
at de.codecentric.jbehave.junit.monitoring.JUnitReportingRunner.run(JUnitReportingRunner.java:78) 
... 6 more 

Вот мой служебный класс для тестирования. Один из способов, очень простые:

package org.felimar; 

public abstract class StringManipulation 
{ 
    public static boolean stringBlank(final String src) 
    { 
    return src.matches("^\\s*$"); //$NON-NLS-1$ 
    } 
} 

История файл для JBehave:

Utilities for managing character strings 

Narrative: 
In order to easily manipulate and investigate character strings 
As a development team 
I want to use a group of string-related utilities 

Scenario: A string contains zero or more characters 
Given a source string with value <value> 
Then the method should return <return> 

Examples: 
|value|return| 
|""|true| 
|" "|true| 
|"Normal Non-Blank"|false| 

ступенек Класс:

package org.felimar.steps; 

import static org.felimar.StringManipulation.stringBlank; 

import org.felimar.StringManipulation; 
import org.jbehave.core.annotations.Given; 
import org.jbehave.core.annotations.Named; 
import org.jbehave.core.annotations.Then; 

public class StringManipulationSteps 
{ 
    private String m_srcString; 

    public String getSrcString() 
    { 
    return m_srcString; 
    } 

    @Given("a source string with value $value") 
    public void givenValue(@Named("value") final String srcString) 
    { 
    setSrcString(srcString); 
    } 

    public void setSrcString(final String srcString) 
    { 
    m_srcString = srcString; 
    } 

    @Then("the method should return $value") 
    public void stringBlankRtrns(@Named("value") final boolean isBlank) 
    { 
    if (stringBlank(getSrcString()) != isBlank) 
     throw new RuntimeException("stringBlank did not determine *" + 
           getSrcString() + "* was " + isBlank); 
    } 
} 

И, наконец, история класс:

package org.felimar.stories; 

import static java.util.Arrays.asList; 
import static org.jbehave.core.reporters.Format.CONSOLE; 
import static org.jbehave.core.reporters.Format.TXT; 

import java.util.List; 

import org.felimar.StringManipulation; 
import org.felimar.steps.StringManipulationSteps; 
import org.jbehave.core.configuration.MostUsefulConfiguration; 
import org.jbehave.core.junit.JUnitStories; 
import org.jbehave.core.reporters.StoryReporterBuilder; 
import org.jbehave.core.steps.InjectableStepsFactory; 
import org.jbehave.core.steps.InstanceStepsFactory; 
import org.junit.runner.RunWith; 

import de.codecentric.jbehave.junit.monitoring.JUnitReportingRunner; 

@RunWith(JUnitReportingRunner.class) 
public class StringManipulationStories extends JUnitStories 
{ 
    public StringManipulationStories() 
    { 
    super(); 
    super.useConfiguration(
    new MostUsefulConfiguration().useStoryReporterBuilder(
     new StoryReporterBuilder().withDefaultFormats().withFormats(
      CONSOLE, TXT))); 
    } 

    @Override 
    public InjectableStepsFactory stepsFactory() 
    { 
    return new InstanceStepsFactory(configuration(), 
            new StringManipulationSteps()); 
    } 

    @Override 
    protected List<String> storyPaths() 
    { 
    return asList("org/felimar/stories/StringManipulationStories.story"); 
    } 
} 

Есть ли очевидные ошибки в любом из t он код, или я должен отказаться от использования бета-библиотек?

+0

На первый взгляд, код выглядит просто отлично. Я еще не пробовал себя с бета-версией 4.0. В том же примере работает со стабильной версией JBehave? Если да, я хотел бы спросить вас, чтобы создать проблему для этого в нашем трекере на github: https://github.com/codecentric/jbehave-junit-runner/issues – AndreasEK

+0

. Одна вещь, которую вы могли бы попробовать, - использовать JUnitReportingRunner.recommandedControls (configureEmbedder()); в вашем конструкторе как последняя строка, как описано здесь: https://github.com/codecentric/jbehave-junit-runner#enabling – AndreasEK

+0

Благодарим вас за предложения Андреаса. Я ответил на мой вопрос, чтобы объяснить, какие из ваших предложений работали для меня, а также подняли вопрос в GitHub (# 70), согласно вашему запросу. – Flic

ответ

2

Я нашел проблему с JUnit-4.12-beta-1. У меня был скрипт сборки Gradle, равный 4. +, поэтому я изменил его, указав 4.11, и проблема исчезла. JBehave-core 4.0-beta-9 работает нормально, поэтому я оставил это на месте.

Я также экспериментировал с использованием JUnitReportingRunner.recommandedControls (configureEmbedder()); как последняя строка конструктора, но на самом деле это породило дополнительную ошибку.

Благодарим Андреаса за его полезные предложения - они были очень оценены и в конечном итоге помогли мне решить мою проблему.

С наилучшими пожеланиями, Флик

+0

Это сработало для меня, но я также должен был убедиться, что jbehave-junit-runner находится в последней версии (ранее на 1.0.1, обновлен до 1.1.2). JBehave-core 4.0-beta-10 также кажется прекрасным, но будет оставаться заблокированным на этой версии и обновляться осторожно. – RCross