2015-01-18 2 views
1

Я новичок в модульном тестировании, и я столкнулся с проблемой jMock, которую я не могу понять. У меня есть общедоступная переменная конечного экземпляра, которую мне нужно определить для ожидания, но я не могу заставить ее работать. Если я создаю геттер для переменной, он работает, но я бы предпочел не создавать кучу геттеров, просто чтобы выполнить модульное тестирование. Любая помощь в том, как это сделать, будет высоко оценена. Вот некоторый код illustraiting то, что я пытаюсь сделать:Определите ожидания для публичной переменной конечного экземпляра

public class Main { 
    private SimpleObject simpleObject; 

    public Main(SimpleObject o){ 
     this.simpleObject = o; 
    } 

    public int iDontWork(){ 
     return simpleObject.myList.size(); 
    } 

    public int iWork(){ 
     return simpleObject.getMyList().size(); 
    } 
} 

Мой тест:

@RunWith(JMock.class) 
public class MainTest { 
    Mockery context = new Mockery() {{ 
     setImposteriser(ClassImposteriser.INSTANCE); 
    }}; 
    @Mock 
    SimpleObject simpleObject; 
    private Main main; 

    @Before 
    public void setup(){ 
     main = new Main(simpleObject); 
    } 

    @Test 
    public void itWorks() { 
     context.checking(new Expectations() {{ 
      oneOf(simpleObject).getMyList(); 
      will(returnValue(new ArrayList<String>(Arrays.asList("Hey")))); 
     }}); 
     int i = main.iWork(); 
     assertEquals(1, i); 
    } 

    @Test 
    public void itDoesntWork() { 
     context.checking(new Expectations() {{ 
      oneOf(simpleObject).myList.size(); will(returnValue(1)); 
     }}); 
     int i = main.iDontWork(); 
     assertEquals(1, i); 
    } 
} 

SimpleObject:

public class SimpleObject { 
    public final List<String> myList; 

    public SimpleObject(){ 
     myList = Collections.unmodifiableList(Arrays.asList("Hey")); 
    } 

    public List<String> getMyList(){ 
     return myList; 
    } 
} 
+0

Ум, где эта публичная переменная конечного экземпляра, о которой вы говорите? Я никого не вижу. Кроме того, традиционно создавать геттеры в любом случае, потому что множество автоматизированных инструментов сканирует геттеры, чтобы узнать, какие поля есть у объекта. Возможно, посмотрите на Groovy, который автоматически их создает для вас? – chrylis

+0

А, я думаю, вы говорите о 'SimpleObject'. Согласие иметь этих геттеров. – chrylis

+0

Действительно? Некоторые проекты с открытым исходным кодом [не согласны] (http://wiki.apache.org/cassandra/CodeStyle): «Предпочитайте публичные конечные поля для частных полей с помощью геттеров». – taylordurden

ответ

0

фиктивный объект реализует методы реального объекта. Он не имеет полей реального объекта (даже если эти поля являются общедоступными).

+0

Макет объекта реализует часть публичного API реального объекта. Публичные поля являются частью этого открытого API. – chrylis

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