2016-11-10 11 views
0

Here're私のベースのインタフェースのいくつか:私は 'の2つのモックを持っている:あなたは調査中で、テストで見ることができるようにスポークの可能性のあるバグ?

public interface ParsingService { 
    boolean isQualifiedNode(Resource resource) 
} 

interface IndexBuilder { 
    boolean buildSingleResource(Resource resource) 
} 


// An OSGI component. Also an implementation for IndexBuilder 
@Component(
    immediate = true 
) 
@Service 
class SolrIndexBuilder implements IndexBuilder { 
    List<ParsingService> parsers 

    @Override 
    public boolean buildSingleResource(Resource subject) { 
     boolean success = true 
     SolrClient client = serverConfiguration.getSolrClient() 

     for (ParsingService parser : parsers) { 
      try{ 
       if(parser.isQualifiedNode(subject)) { 
        client.commit() 
       } 
       else { 
        log.debug(" ${subject.path} not qualified for parsing by parser: ${parser.serviceSummary}") 
        continue //continue to trying the next parser 
       } 
      } catch (Exception e) { 
       success = false 
       log.error("error while parsing resource: ${subject} by parser: ${parser.serviceSummary}") 
       continue //continue to trying the next parser 
      } 
     } 
     return success 
    } 
} 

そして、ここでは、対応するスポックユニットテスト

class SolrIndexBuilderSpecification extends Specification { 
    SolrIndexBuilder indexBuilder 
    SolrClient mockClient = Mock() 
    SolrServerConfiguration mockServerConfiguration = Mock() 
    ParsingService parser = Mock() 
    ParsingService parser_page = Mock() 
    ParsingService parser_asset = Mock() 

    def setup(){ 
     indexBuilder = new SolrIndexBuilder() 
     mockServerConfiguration.getSolrClient() >> mockClient 
    } 

    def "testing buildSingleResource: only parsers who qualify a node, will process the node under scrutiny"() { 
     setup: 
     Resource pageResource = Mock() 
     parser.isQualifiedNode(_) >> false 
     parser_page.isQualifiedNode(_) >> true // WHY does this not return true in method under test? 
     indexBuilder.parsers = Arrays.asList(parser,parser_page) 

     when: 
     indexBuilder.buildSingleResource(pageResource) 

     then: 
     1 * parser.isQualifiedNode(pageResource) 
     1 * parser_page.isQualifiedNode(pageResource) 
     /* 
     * TODO: Troubleshoot below when you have the time. 
     * Parser is supposed to invoke mockClient.commit() call once. So the invocation clause: 
     * 1 * mockClienct.commit() 
     * 
     * should yield true. However, that doesn't hold. Instead the invocation clause: 
     * 0 * mockClient.commit() 
     * 
     * holds true. 
     */ 
     0 * mockClient.commit() // SHOULDN"T BE !! One of the parsers should return true for 'isQualifiedNode(..)' 
    } 
} 

ですParsingService 'インタフェースが定義されています。それらは 'parser'と 'parser_page'です。また、それらのうちの1つは.isQualifiedNode(..)メソッドが呼び出されたときにtrueを返すように設計されています。ただし、両方の場合、falseのみが返されます。どうして ?誰かがこれを再現しようとすることができます。私がもっと見るほど、私はそれがバグだと確信しています、私はspockの基本を理解していない限り!

答えて

2

parser.isQualifiedNode(_) >> false 
    parser_page.isQualifiedNode(_) >> true 

を取り除くと...これはそれがある方法ですなぜ、わからない作品

1 * parser.isQualifiedNode(pageResource) 
    1 * parser_page.isQualifiedNode(pageResource) 

1 * parser.isQualifiedNode(pageResource) >> false 
    1 * parser_page.isQualifiedNode(pageResource) >> true 
+0

感謝を変更するだけでなく、Iなさいこれはスポークの文書に書かれています。 –

関連する問題