2012-05-15 9 views
2

Я пытаюсь выяснить способ проверить класс конструктор следующим образом (имейте в виду, что это теоретический пример)Java тестирование проверки конструктор

public MyClass extends ItemContainer { 

    public MyClass(RoundItem a, SquareItem b) { 
     addItem(a); 
     addItem(b); 
    } 
} 

Я хотел бы, чтобы убедиться, что конструктор называется addItem один раз с любым (RoundItem.class) и один раз с любым (SquareItem.class). Кажется, я не могу найти хороший способ проверить конструктор таким образом с помощью PowerMock или Mockito. Есть идеи?

+0

Почему этого недостаточно, чтобы убедиться, что был добавлен ровно один круглый предмет и один квадрат? –

+1

Этого было бы достаточно. Но скажем для этого упражнения, что MyClass только для чтения. После создания элемента невозможно получить «getItems()» или шаблон доступа аналогичного типа. –

ответ

2

Вам не нужна фальшивая структура, чтобы проверить это. Вы можете сделать объект Test Spy.

, например:

@Test 
public void testMyClassConstruction() throws Exception { 
    MyClass myClass = new MyClass() { 
    public int size() { 
     return items.size(); 
    } 
    } 

    assertEquals(2, myClass.size()); 
} 
+1

Это опускает необходимость утверждать их порядок вставки, а также тип. –

+2

@Matt Вы можете делать все, что хотите, в объекте Test Spy, доза не должна быть такой. Например, пусть шпион вернет вам элементы, тогда вы можете утверждать порядок и тип. –

2

Прежде всего, вы должны остерегаться поместить любую логику в свой конструктор. (для того, чтобы их не тестировать). Элементы a и b могут быть помещены в контейнер по коду клиента (и вы можете использовать имитирующие фреймворки для проверки, но есть более простые способы сделать это).

Рассмотрите возможность проверки out Misko Hevery's набор лекций по тестированию, чтобы получить достаточный фон для правильного тестирования модулей.

0

Mockite используется исключительно для целей Mocking, если вы хотите проверить другие вещи, я бы предложил вам взглянуть на JUnit. Это один из лучшие тестовые рамки для Java. В противном случае вы всегда можете просто System.out.print в своем конструкторе, чтобы узнать, сколько раз он вызывается.

+0

System.out не будет очень хорошим тестом. Такое тестирование не может быть автоматизировано и гарантировать качество в продукте жизненного цикла разработки. –

0
new Verifications() { 
      {   
      addItem(a); times=1; 
      addItem(b); times=1; 
      } 
     }; 

Таким образом, вы можете проверить, является ли методы, где called.In это можно издеваются объекты «а» & «б»

Или вы могли бы использовать " withInsatceLike»

Ex:

addItem(withInsatceLike(a)); 

Надеюсь, это поможет