2017-06-19 13 views
0

私のヘルパークラスの静的メソッドでgetMarkup()を呼び出すと、NPEがスローされます。私がしたことは、MarkupMakerとその戻り値の両方を嘲笑することでした。これはMarkupのインスタンスです。最終的に、MarkupインスタンスのtoString()に電話したいと思います。私が何をしても、getMarkup()の呼び出しはNPEを投げています。どのようにしてメソッド呼び出しの値をspockで呼び出すかを教えてくれるドキュメントはどこにもありません。Spock Mocking - 私のメソッド呼び出し値が嘲笑されない

EDIT:例を追加しました。 maker.getMarkup()の呼び出しは、私がスポークテストでそれを嘲笑したとしても、nullを返します。

Test.groovy

class TestExample extends Specification { 

    @Shared 
    MarkupMaker makerMock = Mock() 
    @Shared 
    MarkupObject markupMock = Mock() 

    def setup() { 
     markupMock.toString() >> "headline1" 
     makerMock.getMarkup() >> markupMock 
    } 

    @Unroll 
    def "Should return a Markupvalue #expectedvalue"(MarkupMaker helper, int tabElementIndex, String expectedValue) { 
     expect: 
     MarkupHelper.getMarkupForIndex(helper, tabElementIndex) == expectedValue 
     where: 
     helper | tabElementIndex | expectedValue 
     makerMock | 1    | "headline1" 

    } 

} 

Helper.java(モックオブジェクトのメソッドを実行する)

public class MarkupHelper { 

    public static MarkupObject getMarkupForIndex(MarkupMaker maker, int index){ 
    if(index == 1){ 
     maker.getMarkup(); 
    } 
    return null; 
    } 
} 

MarkupMaker.java(モックオブジェクトのうちの1つ)

public class MarkupMaker { 

    public MarkupObject getMarkup() { 
    return new MarkupObject(); 
    } 
} 

MarkupObject.java(について試験値を保持している最後のモックオブジェクト)

public class MarkupObject { 
    @Override 
    public String toString() { 
    return "headline1"; 
    } 
} 
+0

[MVCE](https://stackoverflow.com/help/mcve)を投稿してください。問題のコードがどのように呼び出されるかは、このスニペットからは明らかではありません。 –

+0

大丈夫WIP atm – xetra11

答えて

1

それはモックではサポートされていないとして、モックで@Sharedを削除します。

1

あなたが指定した例では、MarkupHelperは常にを返します。あなたは単にmaker.getMarkup()と呼んでいて、何もしません。したがって、実行は続行され、return nullとなります。

@Sharedの理由から、Leonardの回答が正しいのですが、Nockを狙ったオブジェクトに載せているのはなぜですか.MarkupHelperが実際には期待していないため、テストはまだ満足できません。

同様に、toStringをスタブしているMarkupObjectモックは、使用したいときにはシミュレーションの外にあり、使用されないため動作しません。それを処理するために、あなたはあなたのMarkupHelperは次のように文字列を返す必要があります:あなたはまだMarkupHelperがMarkupObjectを返すようにしたい場合は

public static String getMarkupForIndex(MarkupMaker maker, int index){ 
    if(index == 1){ 
     return maker.getMarkup().toString(); 
    } 
    return null; 
} 

、あなたのテストであなたの代わりに持っている期待されるMarkupObjectを作成する必要があります実際のプロパティと同じプロパティ。

1

すべてのテストメソッド内にすべてのオブジェクトを作成して模擬することをお勧めします。この場合、すべてのテストが分離され、共有データが結果に影響を与えないことを確認します。

憂慮あなたの例を私はこれらの2回の試験でgetMarkupForIndex方法をカバーする:

@Unroll 
def "getMarkupForIndex(..) returns null when the given index is #givenIndex"(){ 
    given: 
    def mockedMaker = Mock(MarkupObject) 

    when: 
    def actualResult = MarkupHelper.getMarkupForIndex(mockedMaker, givenIndex) 

    then: 
    actualResult == null 
    0 * _._ // no mock interaction at all 

    where: 
    givenIndex << [0, 2, 3] 
} 

def "getMarkupForIndex(..) returns a markup object when the given index is 1"(){ 
    given: 
    def expectedMarkupObject = new MarkupObject() 
    def mockedMaker = Mock(MarkupMaker) { 
     getMarkup() >> expectedMarkupObject 
    } 

    when: 
    def actualResult = MarkupHelper.getMarkupForIndex(mockedMaker, 1) 

    then: 
    actualResult.is(expectedMarkupObject) 
    1 * mockedMaker.getMarkup() 
}