2016-11-10 1 views
0

dont voici quelques de mes interfaces de base:Spock possible bug?

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 
    } 
} 

Et voici le spock correspondant test unitaire

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(..)' 
    } 
} 

Comme vous pouvez le voir dans le test sous enquête: J'ai deux Mocks pour le ' L'interface de ParsingService est définie. Ils sont 'parser' et 'parser_page'. En outre, l'un d'eux est conçu pour renvoyer true lorsque la méthode .isQualifiedNode (..) est appelée. Cependant, pour les deux, seulement false est retourné. POURQUOI ? Quelqu'un peut-il essayer de recréer cela? Plus je regarde, plus je suis convaincu que c'est un bug, à moins que je ne comprenne pas fondamentalement le spock!

Répondre

2

Débarrassez-vous de

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

Et changer

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

À

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

Merci qui fonctionne ... Je ne sais pas, pourquoi est-ce la façon dont il est, mais je aussi trouvé cela écrit dans les documentations Spock. –