SlideShare a Scribd company logo
Курс по Java, 2016
Reflection, Mock
java.lang.reflect, Mockito
Курс по Java, 2016
Reflection — отражение
Курс по Java, 2016
java.lang.Class
Class<String> clazz = String.class;
String s = "abc";
Class<? extends String> clazz = s.getClass();
Class<?> clazz = Class.forName("java.lang.String");
Курс по Java, 2016
java.lang.ClassLoader
ClassLoader loader = clazz.getClassLoader();
ClassLoader loader = ClassLoader.getSystemClassLoader();
Class<?> newClazz =
loader.loadClass("it.sevenbits.MyClass");
Class<?> newClazz =
Class.forName("it.sevenbits.MyClass", true, loader);
Курс по Java, 2016
Что JVM делает с .class
http://blog.jamesdbloom.com/JVMInternals.html
Курс по Java, 2016
Свой ClassLoader
class NetworkClassLoader extends ClassLoader {
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// откуда-то загрузить содержимое .class
}
}
Курс по Java, 2016
Создание объекта
Class<String> clazz = String.class;
String emptyString = clazz.newInstance(); // ""
Только конструктор по умолчанию
Курс по Java, 2016
Конструкторы
Class<String> clazz = String.class;
Constructor<String> constructor =
clazz.getConstructor(byte[].class, String.class);
String s = constructor.newInstance(
new byte[] {'a', 'b', 'c'}, "ascii");
assertEquals("abc", s);
Курс по Java, 2016
Конструкторы
Constructor nonPublicConstructor =
clazz.getDeclaredConstructor();
Constructor[] publicConstructors =
clazz.getConstructors();
Constructor[] allConstructors =
clazz.getDeclaredConstructors();
Курс по Java, 2016
Методы
Class<String> clazz = String.class;
Method method = clazz.getMethod("charAt", int.class);
Object obj = "abc";
Object result = method.invoke(obj, 1);
assertEquals('b', result);
Курс по Java, 2016
Методы
Method nonPublicMethod = clazz.getDeclaredMethod("clone");
Method[] publicMethods = clazz.getMethods();
Method[] allMethods = clazz.getDeclaredMethods();
Курс по Java, 2016
Поля
Class clazz = MyClass.class;
Field field = clazz.getField("myField");
Object obj = new MyClass();
Object value = field.get(obj);
assertEquals(3, value);
field.set(obj, 42);
assertEquals(42, ((MyClass)obj).myField);
Курс по Java, 2016
Доступ к приватному полю
Class clazz = MyClass.class;
Field field = clazz.getDeclaredField("privateField");
field.setAccessible(true);
Object obj = new MyClass();
field.set(obj, "new value");
Object value = field.get(obj);
assertEquals("new value", value);
Курс по Java, 2016
Исключения
ClassNotFoundException — не найдено класса
InstantiationException — не удалось создать объект
NoSuchMethodException — нет такого метода (или конструктора)
NoSuchFieldException — нет такого поля
IllegalAccessException — нет доступа к методу или полю (private)
InvocationTargetException — не получилось вызвать метод
Курс по Java, 2016
Reflection может быть медленным
http://ashkrit.blogspot.ru/2013/01/java-reflection-facts.html
Курс по Java, 2016
Курс по Java, 2016
Mockito
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
Курс по Java, 2016
Создать заглушку
import static org.mockito.Mockito.*;
IReader mockReader = mock(IReader.class);
Курс по Java, 2016
Определить поведение заглушки
// возврат значения
when(mockReader.read()).thenReturn('a', 'b', 'c');
// выброс исключения
doThrow(Exception.class).when(mockReader).close();
Курс по Java, 2016
Определить поведение заглушки
doAnswer(new Answer() {
public Object answer(InvocationOnMock invocationOnMock)
throws Throwable {
char[] chars =
(char[]) invocationOnMock.getArguments()[0];
chars[0] = 'a'; chars[1] = 'b'; chars[2] = 'c';
return null;
}
}).when(mockReader).readArray(any(char[].class));
Курс по Java, 2016
Вызов методов заглушки
assertEquals('a', mockReader.read());
assertEquals('b', mockReader.read());
assertEquals('c', mockReader.read());
char[] chars = new char[3];
mockReader.readArray(chars);
assertArrayEquals(new char[] {'a', 'b', 'c'}, chars);
mockReader.close();
Курс по Java, 2016
Проверка вызовов заглушки
// read() вызван ровно 3 раза
verify(mockReader, times(3)).read();
// readArray вызван один раз с каким-то char[]
verify(mockReader).readArray(any(char[].class));
Курс по Java, 2016
Алгоритм работы с заглушками
// создание заглушки
IReader mockReader = mock(IReader.class);
// определение поведения (если нужно)
when(mockReader.read()).thenReturn('a');
// использование
assertEquals('a', mockReader.read());
// проверка вызовов (если нужно)
verify(mockReader).read();
Курс по Java, 2016
Домашнее задание
Написать тесты на все реализации потоков, используя Mockito.
Можно ли написать тесты на интерфейсы, чтобы проверять любую новую
реализацию, не написав для нее ни одного нового теста?
annie.tarasenko@7bits.it denis.nelubin@7bits.it

More Related Content

PDF
Курс Java-2016. Занятие 12. DBMS, JDBC
PDF
Курс Java-2016. Занятие 04 (часть 1). Еще немного про Generics
PDF
Курс Java-2016. Занятие 08. Итераторы, многопоточность
PDF
Курс Java-2016. Занятие 07. Логи, фасады, библиотеки и коллекции
PDF
Java осень 2014 занятие 3
PPTX
Зачем нужна Scala?
PDF
JavaScript Базовый. Занятие 04.
PDF
JavaScript Базовый. Занятие 02.
Курс Java-2016. Занятие 12. DBMS, JDBC
Курс Java-2016. Занятие 04 (часть 1). Еще немного про Generics
Курс Java-2016. Занятие 08. Итераторы, многопоточность
Курс Java-2016. Занятие 07. Логи, фасады, библиотеки и коллекции
Java осень 2014 занятие 3
Зачем нужна Scala?
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 02.

What's hot (15)

PPT
8. java lecture threads
PPT
Groovy
PPTX
Java Core. Lecture# 3. Part# 3. Multithreading.
PPTX
Java Core. Lecture# 5. Concurrency.
PPTX
Java Core. Lecture# 3. Part# 2. Exceptions.
PDF
Java осень 2014 занятие 5
PDF
JavaScript Базовый. Занятие 08.
PPT
10. java lecture generics&collections
PPTX
Java Core. Lecture# 1. Intro
PDF
Date & Time in Java SE 8
PDF
C++ Базовый. Занятие 15.
PPTX
Java весна 2013 лекция 9
ODP
Обработка ошибок и исключений
PPT
Java. Сборщик мусора. Работа с памятью.
PPT
3. java lecture classes
8. java lecture threads
Groovy
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 3. Part# 2. Exceptions.
Java осень 2014 занятие 5
JavaScript Базовый. Занятие 08.
10. java lecture generics&collections
Java Core. Lecture# 1. Intro
Date & Time in Java SE 8
C++ Базовый. Занятие 15.
Java весна 2013 лекция 9
Обработка ошибок и исключений
Java. Сборщик мусора. Работа с памятью.
3. java lecture classes
Ad

Viewers also liked (11)

PPTX
Курс Java-2016. Занятие 13. Spring
PDF
Курс Java-2016. Занятие 11. Servlets, JSP
PPTX
Спецкурс-2015. Занятие 04 (часть 1). Конфигурации, сборка проекта, автоматизи...
PPTX
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
PPTX
Спецкурс-2015. Занятие 05. Системы контроля версий
PDF
Стажировка-2015. Разработка. Занятие 13. Сборка фронтенда
PPTX
Стажировка-2015. Разработка. Занятие 14. Twitter Flight
PPTX
курс Java 2016. занятие 03. интерфейсы, generic, исключения
PPTX
Спецкурс-2015. Занятие 03. Абстракции, именование, документирование.
PPTX
Курс Java-2016. Занятие 01. Введение в Java как технологию
PPTX
Спецкурс-2015. Занятие 04 (часть 2). Обработка исключительных ситуаций, запи...
Курс Java-2016. Занятие 13. Spring
Курс Java-2016. Занятие 11. Servlets, JSP
Спецкурс-2015. Занятие 04 (часть 1). Конфигурации, сборка проекта, автоматизи...
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
Спецкурс-2015. Занятие 05. Системы контроля версий
Стажировка-2015. Разработка. Занятие 13. Сборка фронтенда
Стажировка-2015. Разработка. Занятие 14. Twitter Flight
курс Java 2016. занятие 03. интерфейсы, generic, исключения
Спецкурс-2015. Занятие 03. Абстракции, именование, документирование.
Курс Java-2016. Занятие 01. Введение в Java как технологию
Спецкурс-2015. Занятие 04 (часть 2). Обработка исключительных ситуаций, запи...
Ad

More from 7bits (15)

PDF
Гудбай, ИТ-лофт! Тарасенко Анна: Стартап = факап?
PDF
Гудбай, ИТ-лофт! Денис Нелюбин: Новейшая история ИТ-лофта
PDF
Гудбай, ИТ-лофт! Лопатюк Саша: Договоримся не плакать
PDF
Гудбай, ИТ-лофт! Гончаровский Игорь: IT-Loft без связи
PDF
Гудбай, ИТ-лофт! Мячин Сергей: LUDUM DARE + IT-LOFT = LOVE
PDF
Goodbye, IT-loft! Тараканов Алексей: Идеология в IT
PDF
Курс Java-2016. Занятие 09. Web
PDF
Курс Java-2016. Занятие 06. Файлы и ввод-вывод
PPTX
Курс Java-2016. Занятие 05. Тестирование и Java
PDF
Курс Java-2016. Занятие 04 (часть 2). Git и GitHub
PPTX
Стажировка-2015. Разработка. Занятие 12. Транзакции в БД, работа с БД из прил...
PDF
Стажировка-2015. Разработка. Занятие 11. Безопасность web-приложений
PPTX
Стажировка-2015. Разработка. Занятие 10 (часть 2). Исключения и логи.
PPTX
Стажировка-2015. Разработка. Занятие 10 (часть 1). Конфиги, сборка, автотесты
PDF
Стажировка 2015. Разработка. Занятие 9. BEM
Гудбай, ИТ-лофт! Тарасенко Анна: Стартап = факап?
Гудбай, ИТ-лофт! Денис Нелюбин: Новейшая история ИТ-лофта
Гудбай, ИТ-лофт! Лопатюк Саша: Договоримся не плакать
Гудбай, ИТ-лофт! Гончаровский Игорь: IT-Loft без связи
Гудбай, ИТ-лофт! Мячин Сергей: LUDUM DARE + IT-LOFT = LOVE
Goodbye, IT-loft! Тараканов Алексей: Идеология в IT
Курс Java-2016. Занятие 09. Web
Курс Java-2016. Занятие 06. Файлы и ввод-вывод
Курс Java-2016. Занятие 05. Тестирование и Java
Курс Java-2016. Занятие 04 (часть 2). Git и GitHub
Стажировка-2015. Разработка. Занятие 12. Транзакции в БД, работа с БД из прил...
Стажировка-2015. Разработка. Занятие 11. Безопасность web-приложений
Стажировка-2015. Разработка. Занятие 10 (часть 2). Исключения и логи.
Стажировка-2015. Разработка. Занятие 10 (часть 1). Конфиги, сборка, автотесты
Стажировка 2015. Разработка. Занятие 9. BEM

Курс Java-2016. Занятие 10. Reflection, mock

  • 1. Курс по Java, 2016 Reflection, Mock java.lang.reflect, Mockito
  • 2. Курс по Java, 2016 Reflection — отражение
  • 3. Курс по Java, 2016 java.lang.Class Class<String> clazz = String.class; String s = "abc"; Class<? extends String> clazz = s.getClass(); Class<?> clazz = Class.forName("java.lang.String");
  • 4. Курс по Java, 2016 java.lang.ClassLoader ClassLoader loader = clazz.getClassLoader(); ClassLoader loader = ClassLoader.getSystemClassLoader(); Class<?> newClazz = loader.loadClass("it.sevenbits.MyClass"); Class<?> newClazz = Class.forName("it.sevenbits.MyClass", true, loader);
  • 5. Курс по Java, 2016 Что JVM делает с .class http://blog.jamesdbloom.com/JVMInternals.html
  • 6. Курс по Java, 2016 Свой ClassLoader class NetworkClassLoader extends ClassLoader { public Class findClass(String name) { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } private byte[] loadClassData(String name) { // откуда-то загрузить содержимое .class } }
  • 7. Курс по Java, 2016 Создание объекта Class<String> clazz = String.class; String emptyString = clazz.newInstance(); // "" Только конструктор по умолчанию
  • 8. Курс по Java, 2016 Конструкторы Class<String> clazz = String.class; Constructor<String> constructor = clazz.getConstructor(byte[].class, String.class); String s = constructor.newInstance( new byte[] {'a', 'b', 'c'}, "ascii"); assertEquals("abc", s);
  • 9. Курс по Java, 2016 Конструкторы Constructor nonPublicConstructor = clazz.getDeclaredConstructor(); Constructor[] publicConstructors = clazz.getConstructors(); Constructor[] allConstructors = clazz.getDeclaredConstructors();
  • 10. Курс по Java, 2016 Методы Class<String> clazz = String.class; Method method = clazz.getMethod("charAt", int.class); Object obj = "abc"; Object result = method.invoke(obj, 1); assertEquals('b', result);
  • 11. Курс по Java, 2016 Методы Method nonPublicMethod = clazz.getDeclaredMethod("clone"); Method[] publicMethods = clazz.getMethods(); Method[] allMethods = clazz.getDeclaredMethods();
  • 12. Курс по Java, 2016 Поля Class clazz = MyClass.class; Field field = clazz.getField("myField"); Object obj = new MyClass(); Object value = field.get(obj); assertEquals(3, value); field.set(obj, 42); assertEquals(42, ((MyClass)obj).myField);
  • 13. Курс по Java, 2016 Доступ к приватному полю Class clazz = MyClass.class; Field field = clazz.getDeclaredField("privateField"); field.setAccessible(true); Object obj = new MyClass(); field.set(obj, "new value"); Object value = field.get(obj); assertEquals("new value", value);
  • 14. Курс по Java, 2016 Исключения ClassNotFoundException — не найдено класса InstantiationException — не удалось создать объект NoSuchMethodException — нет такого метода (или конструктора) NoSuchFieldException — нет такого поля IllegalAccessException — нет доступа к методу или полю (private) InvocationTargetException — не получилось вызвать метод
  • 15. Курс по Java, 2016 Reflection может быть медленным http://ashkrit.blogspot.ru/2013/01/java-reflection-facts.html
  • 17. Курс по Java, 2016 Mockito <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.10.19</version> <scope>test</scope> </dependency>
  • 18. Курс по Java, 2016 Создать заглушку import static org.mockito.Mockito.*; IReader mockReader = mock(IReader.class);
  • 19. Курс по Java, 2016 Определить поведение заглушки // возврат значения when(mockReader.read()).thenReturn('a', 'b', 'c'); // выброс исключения doThrow(Exception.class).when(mockReader).close();
  • 20. Курс по Java, 2016 Определить поведение заглушки doAnswer(new Answer() { public Object answer(InvocationOnMock invocationOnMock) throws Throwable { char[] chars = (char[]) invocationOnMock.getArguments()[0]; chars[0] = 'a'; chars[1] = 'b'; chars[2] = 'c'; return null; } }).when(mockReader).readArray(any(char[].class));
  • 21. Курс по Java, 2016 Вызов методов заглушки assertEquals('a', mockReader.read()); assertEquals('b', mockReader.read()); assertEquals('c', mockReader.read()); char[] chars = new char[3]; mockReader.readArray(chars); assertArrayEquals(new char[] {'a', 'b', 'c'}, chars); mockReader.close();
  • 22. Курс по Java, 2016 Проверка вызовов заглушки // read() вызван ровно 3 раза verify(mockReader, times(3)).read(); // readArray вызван один раз с каким-то char[] verify(mockReader).readArray(any(char[].class));
  • 23. Курс по Java, 2016 Алгоритм работы с заглушками // создание заглушки IReader mockReader = mock(IReader.class); // определение поведения (если нужно) when(mockReader.read()).thenReturn('a'); // использование assertEquals('a', mockReader.read()); // проверка вызовов (если нужно) verify(mockReader).read();
  • 24. Курс по Java, 2016 Домашнее задание Написать тесты на все реализации потоков, используя Mockito. Можно ли написать тесты на интерфейсы, чтобы проверять любую новую реализацию, не написав для нее ни одного нового теста? annie.tarasenko@7bits.it denis.nelubin@7bits.it