2017-01-13 6 views
0

Я хочу, чтобы проверить следующий класс:Mockito: макет вводил член вновь образованного объект

public class ClassToTest { 
    private List<Bar> bars = new LinkedList<>(); 

    public makeBarsFromIDs(List<Integer> idList) { 
     for (Integer id : idList) { 
      Bar bar = new Bar(); 
      bar.setID(id); 
      bars.add(bar); 
     } 
    } 

    public List<String> getFooStringsFromBars() { 
     List<String> fooStrings = new LinkedList(); 
     for (Bar bar : this.bars) 
      fooStrings.add(bar.getFooListAsString()); 
     return fooStrings; 
    } 
} 

В addToBarList, A Bar объекта инстанциирован.

public class Bar { 
    private int myID; 

    @Inject 
    private FooRepository fooRepository; 

    public setID(int ID) { 
     myID = ID; 
    } 

    public String getFooListAsString() { 
     return fooRepository.findByID(myID).toString(); 
    } 
} 

Бар использует FooRepository, который я хочу высмеять. Это отлично работает, если я тестирую Bar, но как я могу проверить ClassToTest и все же высмеивать FooRepository?

Я не могу просто высмеять Bar, так как создаются несколько экземпляров с разными значениями. И мне нужно проверить, правильно ли они созданы.

+0

Если вы хотите, чтобы дразнить 'Bar' затем вы не можете выполнить 'Bar bar = new Bar();' внутри метода. Если вы используете фреймворк вроде Spring, то вводите «Bar» в качестве зависимости, а затем издевайтесь над ним. – user2004685

+0

Я не хочу издеваться над баром, я хочу издеваться над fooRepository внутри бара. – user2727133

+0

Я немного удалил свой пример кода. Дело в том, что 'ClassToTest' создает несколько контуров« Bar »внутри цикла. Как я издеваться над ними? Я думал, может быть, какое-то расширение, такое как PowerMock, может это сделать. – user2727133

ответ

0

Вам не нужно высмеивать FooRepository, если вы тестируете ClassToTest, поскольку он будет служить ящиком для этого класса. Все, что вам нужно сделать, это выкрикнуть Bar и написать тест.

Но прежде чем сделать это, вам придется начать инъекционным Bar как в вашем зависимые пакеты ClassToTest точно так же, как вы делали это для FooRepository в случае Bar.

Это потому, что если у вас есть следующий оператор в вашем методе, то новый объект onject будет создан для Bar, и вы не сможете заменить его своим макетом.

Bar bar = new Bar(); 

После внесения соответствующих изменений, ваш ClassToTest должен выглядеть следующим образом:

public class ClassToTest { 

    @Inject 
    private Bar bar; 

    public addToBarList(barID) { 
     bar.setID(fooID); 

     List<Foo> fooList = bar.getFooList(); 
     ... 
    } 
} 

Ваш тестовый класс должен выглядеть следующим образом:

public class SomeTest { 

    @Mock 
    private Bar bar; 

    @InjectMocks 
    private ClassToTest testClass; 

    @Before 
    public void init() { 
     Mockito.initMocks(this); 
    } 

    @Test 
    public void testAdd() { 
     Mockito.when(bar.getFooList()).thenReturn(Arrays.asList(new Foo())); 
     testClass.addToBarList(...); 
    } 
} 
+0

Как я писал в своем последнем комментарии, мой примерный код был слишком мало убран. У меня на самом деле есть 'Collection'' Bar', который заполняется 'ClassToTest'. – user2727133

+0

@ user2727133 Иногда вам нужно переосмыслить свой дизайн, чтобы эффективно использовать фреймворки, такие как 'Mockito'. Пожалуйста, укажите недостающий код, а затем, возможно, я могу помочь вам лучше. – user2004685

+0

Я сейчас редактировал свой код. Большое вам спасибо за ваши усилия. – user2727133

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

  • Нет связанных вопросов^_^