JMockit возвращает коллекцию - PullRequest
1 голос
/ 03 июня 2010

У меня есть следующий код:

public void someMethod() {
     Set<Foo> fooSet = bar.getFoos();

     for(Foo foo: fooSet) {
         foo.doSomething();
     }
}

и я хочу проверить это с помощью JMockit, но не уверен, как получить коллекцию определенного типа и размера.

Следующий тест для моего кода выдает исключение нулевого указателя для хэш-кода при попытке добавить foo в набор foos.

@Test
public void someTestMethod()
{
     new Expectations()
     {
         @Mocked Bar bar;
         @Mocked Foo foo;


         Set<Foo> foos = new HashSet<Foo>();
         foos.add(foo);

         bar.getFoos(); returns(foos);
         foo.doSomething();
     };

     new SomeClass().someMethod();
}

Как это сделать?

1 Ответ

3 голосов
/ 11 июня 2010

Я не совсем уверен, как ответить на ваш вопрос, потому что я не понимаю, что вы пытаетесь проверить, но я верю, что вы хотите что-то вроде этого:

@Test
public void someTestMethod(@Mocked(methods="getFoos")final Bar mockedBar
                           @Mocked(methods="doSomething")final Foo mockedFoo {

   final Set<Foo> foos = new HashSet<Foo>();
   foos.add(new Foo()); 

   new Expectations() {
      {
         mockedBar.getFoos(); returns(foos);
         mockedFoo.doSomething();
      }
   };

   new SomeClass().someMethod();
}

Используя это, JMockit будет высмеивать вызов getFoos и возвращает Set foos. Если вы посмотрите на параметры, которые я передаю, я делаю частичное макетирование классов Bar и Foo (я только высмеиваю вызовы методов getFoos и doSomething). Я также заметил, что в вашем блоке new Expectations отсутствует набор скобок, так что это может определенно вызвать некоторые проблемы. Еще одна проблема, которую вы должны иметь в виду, заключается в том, что использование Expectations в отличие от NonStrictExpectations приведет к ошибке, если вы поместите более одного объекта в Set foos, поскольку он ожидает только один вызов doSomething. Если вы создадите тестовый пример, в котором foos содержит более одного объекта, вы можете либо использовать NonStrictExpectations, либо использовать minTimes и maxTimes для указания ограничений на количество вызовов

...