2015-10-05 5 views
1

У меня возникли трудности с попыткой издеваться над зависимостью в коллекции Guava.Spock Mock с коллекцией Guava

Давайте предположим, что у меня есть следующий код теста:

@Service 
public final class ServiceA { 

    private final ServiceB serviceB; 

    @Autowired 
    public ServiceA(ServiceB serviceB) { 
     this.serviceB = serviceB; 
    } 

    public Collection<String> runAll(Collection<String> dataList) { 
     final ImmutableList.Builder<String> builder = ImmutableList.builder(); 

     for (String data : dataList) { 
      builder.add(serviceB.run(data)); 
     } 

     return builder.build(); 
    } 
} 

Мой Спок Spec выглядит следующим образом:

class ServiceASpec extends Specification { 
    def serviceB = Mock(ServiceB.class) 
    def serviceA = new ServiceA(serviceB) 

    def "test"() { 
     when: 
     def strings = serviceA.runAll(['data1', 'data2']) 

     then: 
     1 * serviceB.run('data1') >> 'result1' 
     1 * serviceB.run('data2') >> 'result2' 
     0 * _._ 

     strings == ['result1', 'result2'] 
    } 
} 

Эта спецификация работает просто отлично, и делает то, что я хочу, чтобы это сделать ,

Тогда я переработан моя реализация использовать гуавы-х Collections2.transform(..): -

@Service 
public final class ServiceA { 

    private final ServiceB serviceB; 

    @Autowired 
    public ServiceA(ServiceB serviceB) { 
     this.serviceB = serviceB; 
    } 

    public Collection<String> runAll(Collection<String> dataList) { 
     return Collections2.transform(dataList, new Function<String, String>() { 
      @Override 
      public String apply(final String input) { 
       return serviceB.run(input); 
      } 
     }); 
    } 
} 

Когда я перезапускать свою спецификацию, я получаю эту ошибку: -

Too few invocations for: 

1 * serviceB.run('data1') >> 'result1' (0 invocations) 

Unmatched invocations (ordered by similarity): 

None 

Too few invocations for: 

1 * serviceB.run('data2') >> 'result2' (0 invocations) 

Unmatched invocations (ordered by similarity): 

None 

Мое мнение имеет что-то делать с насмешкой, потому что функция Guava будет выполняться только при использовании коллекции.

Однако я не был уверен, как реорганизовать мои спецификации, чтобы это работало.

Как я могу решить это? Благодарю.

ответ

2

Под капотом transform() способ возвращает TransformedCollection класс. Как видите, трансформация here применяется не раньше, чем при повторении завернутой коллекции. Поскольку вы не выполняете итерацию, преобразованная коллекция издевательства не вызывается и взаимодействие не регистрируется.

Кажется, что простое повторение коллекции должно решить проблему, однако такой тест должен быть действительно хорошо документирован.

Другой способ - использовать FluentIterable.from(list).transform(function).toList() вместо Collections2.transform(list, function).

Смежные вопросы