Как начать с тестированием (jMock)

Я пытаюсь учиться как тестам записи. Я также изучаю Java, мне сказали, что я должен изучать/использовать/практиковать jMock, я нашел некоторые статьи онлайн, что справка к определенному расширяется как:

http://www.theserverside.com/news/1365050/Using-JMock-in-Test-Driven-Development

http://jeantessier.com/SoftwareEngineering/Mocking.html#jMock

И большинство статей, которые я нашел, было о разработке через тестирование, тесты записи сначала затем пишут код для создания тестовой передачи. Я не ищу это в данный момент, я пробую к тестам записи на уже существующий код с jMock.

Официальная документация неопределенна по меньшей мере и просто слишком трудна для меня. Делает у кого-либо есть лучший способ изучить это. Хорошие книги/ссылки/учебные руководства помогли бы мне много.спасибо

РЕДАКТИРОВАНИЕ - более конкретный вопрос:

http://jeantessier.com/SoftwareEngineering/Mocking.html#jMock - от этой статьи

Попробованный это для насмешки этого простого класса:

import java.util.Map;
    public class Cache {
        private Map underlyingStorage;
        public Cache(Map underlyingStorage) {
            this.underlyingStorage = underlyingStorage;
        }
        public String get(int key) {
            return underlyingStorage.get(key);
        }
        public void add(int key, String value) {
            underlyingStorage.put(key, value);
        }
        public void remove(int key) {
            underlyingStorage.remove(key);
        }
        public int size() {
            return underlyingStorage.size();
        }
        public void clear() {
            underlyingStorage.clear();
        }
    }

Вот то, как я пытался создать тест/насмешку:

public class CacheTest extends TestCase {

    private Mockery context;
    private Map mockMap;
    private Cache cache;

    @Override
    @Before
    public void setUp() {
        context = new Mockery() {
            {
                setImposteriser(ClassImposteriser.INSTANCE);
            }
        };

        mockMap = context.mock(Map.class);
        cache = new Cache(mockMap);
    }

    public void testCache() {
        context.checking(new Expectations() {{
            atLeast(1).of(mockMap).size(); 
            will(returnValue(int.class));
        }});

    }
}

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

7
задан London 25 May 2010 в 14:53
поделиться

4 ответа

Вот руководство по использованию JUnit и EasyMock (имитирующая библиотека, которую я лично считаю намного проще в использовании, чем JMock): http://www.michaelminella.com/testing/unit -testing-with-junit-and-easymock.html

Даже если вы на 100% посвятили себя использованию JMock, концепции между ними одинаковы, и это должно помочь вам лучше понять их.

Цель насмешек состоит в том, что при тестировании класса A , который зависит от B и C , ваш тест A использует фиктивные версии B и C , чтобы иметь возможность указать их точное поведение, а не использовать реальные реализации B и C в ваш тест A . В противном случае вы не тестируете только одну единицу A , вы также неявно тестируете B и C .

5
ответ дан 6 December 2019 в 21:10
поделиться

Вам не нужно на самом деле имитировать этот класс, так как его единственный сотрудник - это карта, которую вы можете использовать как есть. Кроме того, ваш класс на самом деле ничего не делает (кроме делегата), поэтому вам кажется, что вы мало тестируете.

Прямым тестом может быть (я предполагаю, что вы используете JUnit 4 - ваш код представляет собой странную смесь JUnit 3 и 4

@Test
public void sizeIs0WhenEmpty()
{
  Map<Integer, String> map = Collections.emptyMap();
  Cache cache = new Cache(map)
  assertEquals(0, cache.size());
}

с макетами, которые могут быть (если макет код верен - я не 't use JMock)

@Test
public void sizeIs0WhenEmpty()
{
  context.checking(new Expectations() {{
                   atLeast(1).of(mockMap).size(); 
                   will(returnValue(0));
                   }});
  assertEquals(0, cache.size());
}

В обоих случаях вы настраиваете систему, устанавливая для карты свойства, которые вы хотите протестировать, а затем проверяете, что кеш имеет те же свойства (поскольку это прямой делегат).

I рекомендую вам прочитать о JUnit , прежде чем продолжить.

2
ответ дан 6 December 2019 в 21:10
поделиться

Я не знаю, как далеко вы продвинулись в изучении использования макетных объектов в тестировании, поэтому я напишу краткое описание, а затем укажу вам на статью, которая может быть вам полезна. Макетные объекты используются в модульном тестировании для замены внешних зависимостей, которые сложно создать или сложно привести в нужное для теста состояние. Различные существующие mocking-фреймворки предоставляют вам механизмы для создания "поддельных" объектов, которые занимают место этих зависимостей. Эти поддельные объекты будут отслеживать вызовы, поступающие к ним из вашего кода, и позволят вам впоследствии делать утверждения об этих взаимодействиях. Существует хорошо известная статья о поддельных объектах и их связи с "заглушками", еще одной распространенной стратегией тестирования для упрощения внешних зависимостей. Ее написал Мартин Фаулер, и ее можно найти здесь:

http://martinfowler.com/articles/mocksArentStubs.html

1
ответ дан 6 December 2019 в 21:10
поделиться

Как автор JMock, я бы не стал начинать с этой техники, пока у вас не будет опыта работы с TDD. Просто начните с основ и пусть все заработает. Как только вы начнете испытывать трудности с масштабированием и наращиванием дизайна, вернитесь к технике.

Книга Дэйва Астелса по-прежнему является хорошим введением и, я думаю, единственной из того поколения, которая хорошо объяснила насмешки. После этого вы можете (кхм) рассмотреть наш «Рост объектно-ориентированного программного обеспечения, управляемый тестами»

. Не обращайте внимания на тех, кто говорит вам, что все дело в том, что тесты файловой системы работают быстрее.

4
ответ дан 6 December 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: