Мокито
![]() | Эта статья может быть слишком технической для понимания большинства читателей . ( февраль 2010 г. ) |
Разработчик(и) | Щепан Фабер, Брайс Дютейл, Рафаэль Винтерхальтер, Тим ван дер Липпе и другие. |
---|---|
Стабильная версия | 5.4.0
/ 18 июня 2023 г [1] |
Репозиторий | github |
Написано в | Ява |
Тип | Тестирование |
Лицензия | МОЯ лицензия [2] |
Веб-сайт | сайт |
Mockito — это с открытым исходным кодом среда тестирования для Java, выпущенная под лицензией MIT . [3] [4] Фреймворк позволяет создавать тестовые двойные объекты ( фиктивные объекты ) в автоматизированных модульных тестах с целью разработки через тестирование (TDD) или разработки через поведение (BDD).
Название и логотип фреймворка — это игра с мохито , разновидностью напитка.
Функции
[ редактировать ]Mockito позволяет разработчикам проверять поведение тестируемой системы (SUT), не устанавливая заранее ожиданий. [5] Одним из критических замечаний по поводу макетов объектов является то, что тестовый код тесно связан с тестируемой системой. [6] Mockito пытается устранить шаблон ожидания-выполнения-проверки [7] путем удаления спецификации ожиданий. Mockito также предоставляет некоторые аннотации для сокращения шаблонного кода . [8]
Происхождение
[ редактировать ]Mockito начал с расширения синтаксиса и функциональности EasyMock. [9] [10]
Пример
[ редактировать ]Рассмотрим эту отдельную программу Hello world ; мы можем выполнить модульное тестирование некоторых его частей, используя макеты объектов для других частей.
package org.examples;
import java.io.IOException;
public class HelloApplication {
public static interface Greeter {
String getGreeting(String subject);
String getIntroduction(String actor);
}
public static class HelloGreeter implements Greeter {
private String hello;
private String segmenter;
public HelloGreeter(String hello, String segmenter) {
this.hello = hello;
this.segmenter = segmenter;
}
public String getGreeting(String subject) {
return hello + " " + subject;
}
public String getIntroduction(String actor) {
return actor+segmenter;
}
}
public static interface HelloActable {
void sayHello(String actor, String subject) throws IOException;
}
public static class HelloAction implements HelloActable {
private Greeter helloGreeter;
private Appendable helloWriter;
public HelloAction(Greeter helloGreeter, Appendable helloWriter) {
super();
this.helloGreeter = helloGreeter;
this.helloWriter = helloWriter;
}
public void sayHello(String actor, String subject) throws IOException {
helloWriter.append(helloGreeter.getIntroduction(actor)).append(helloGreeter.getGreeting(subject));
}
}
public static void main(String... args) throws IOException {
new HelloAction(new HelloGreeter("hello", ": "), System.out).sayHello("application", "world");
}
}
Результатом запуска HelloApplication будет следующее:
application: hello world
Модульный тест для компонента HelloActable может выглядеть так:
package org.examples;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
import org.examples.HelloApplication.HelloActable;
import org.examples.HelloApplication.HelloAction;
import org.examples.HelloApplication.Greeter;
public class HelloActionUnitTest {
Greeter helloGreeterMock;
Appendable helloWriterMock;
HelloActable helloAction;
@Before
public void setUp() {
helloGreeterMock = mock(Greeter.class);
helloWriterMock = mock(Appendable.class);
helloAction = new HelloAction(helloGreeterMock, helloWriterMock);
}
@Test
public void testSayHello() throws Exception {
when(helloWriterMock.append(any(String.class))).thenReturn(helloWriterMock);
when(helloGreeterMock.getIntroduction(eq("unitTest"))).thenReturn("unitTest : ");
when(helloGreeterMock.getGreeting(eq("world"))).thenReturn("hi world");
helloAction.sayHello("unitTest", "world");
verify(helloGreeterMock).getIntroduction(eq("unitTest"));
verify(helloGreeterMock).getGreeting(eq("world"));
verify(helloWriterMock, times(2)).append(any(String.class));
verify(helloWriterMock, times(1)).append(eq("unitTest : "));
verify(helloWriterMock, times(1)).append(eq("hi world"));
}
}
Он использует фиктивные объекты для интерфейсов Greeter и Appendable и неявно предполагает следующий вариант использования:
unitTest : hi world
Код интеграционного теста для тестирования HelloActable, подключенного к Greeter, может выглядеть следующим образом:
package org.examples;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
import org.examples.HelloApplication.HelloActable;
import org.examples.HelloApplication.HelloAction;
import org.examples.HelloApplication.Greeter;
import org.examples.HelloApplication.HelloGreeter;
public class HelloActionIntegrationTest {
HelloActable helloAction;
Greeter helloGreeter;
Appendable helloWriterMock;
@Before
public void setUp() {
helloGreeter = new HelloGreeter("welcome", " says ");
helloWriterMock = mock(Appendable.class);
helloAction = new HelloAction(helloGreeter, helloWriterMock);
}
@Test
public void testSayHello() throws Exception {
when(helloWriterMock.append(any(String.class))).thenReturn(helloWriterMock);
helloAction.sayHello("integrationTest", "universe");
verify(helloWriterMock, times(2)).append(any(String.class));
verify(helloWriterMock, times(1)).append(eq("integrationTest says "));
verify(helloWriterMock, times(1)).append(eq("welcome universe"));
}
}
Он использует фиктивные объекты только вместо присоединяемых интерфейсов, использует реальные реализации для других интерфейсов (HelloActable и Greeter) и неявно предполагает следующий вариант использования:
integrationTest says welcome universe
Как видно из операторов импорта классов HelloActionUnitTest и HelloActionIntegrationTest, необходимо поместить несколько файлов Mockito и JUnit в путь к классам, чтобы иметь возможность скомпилировать и запустить тестовые классы.
См. также
[ редактировать ]- Развитие, основанное на поведении
- Список фреймворков модульного тестирования
- Тестирование программного обеспечения
Ссылки
[ редактировать ]- ^ «Обзор релизов проекта на GitHub» . Гитхаб . Проверено 29 апреля 2022 г.
- ^ «Лицензия · Mockito/mockito Wiki · GitHub» . Гитхаб . Проверено 30 августа 2019 г.
- ^ «Mockito в шести простых примерах» . 2009 . Проверено 5 октября 2012 г.
- ^ « Какой макетный фреймворк для Java лучше всего? » . Проверено 29 декабря 2010 г.
- ^ « Особенности и мотивации » . Проверено 29 декабря 2010 г.
- ^ Фаулер, Мартин (2007). « Моки — это не заглушки » . Проверено 29 декабря 2010 г.
- ^ Фабер, Щепан. « Жажда смерти » . Проверено 29 декабря 2010 г.
- ^ Качановский, Томек. «Mockito — Java Mocking Framework с открытым исходным кодом» . Проверено 17 сентября 2013 г.
- ^ Фабер, Щепан. «Мокито» . Архивировано из оригинала 29 марта 2010 г. Проверено 29 декабря 2010 г.
- ^ «Домашняя страница Mockito» . Проверено 29 декабря 2010 г.