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

What's hot

8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threadsMERA_school
 
Groovy
GroovyGroovy
Groovy
Igor Kmets
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
Anton Moiseenko
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
Anton Moiseenko
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.
Anton Moiseenko
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
Technopark
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.
Igor Shkulipa
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collectionsMERA_school
 
Java Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroJava Core. Lecture# 1. Intro
Java Core. Lecture# 1. Intro
Anton Moiseenko
 
Date & Time in Java SE 8
Date & Time in Java SE 8Date & Time in Java SE 8
Date & Time in Java SE 8
Ilya Lapitan
 
C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.
Igor Shkulipa
 
Java весна 2013 лекция 9
Java весна 2013 лекция 9Java весна 2013 лекция 9
Java весна 2013 лекция 9Technopark
 
Обработка ошибок и исключений
Обработка ошибок и исключенийОбработка ошибок и исключений
Обработка ошибок и исключенийitclub_kz
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью.
Unguryan Vitaliy
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classesMERA_school
 

What's hot (15)

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

Viewers also liked

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

Viewers also liked (11)

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

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

Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
Yandex
 
Загрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблейЗагрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблейAnton Arhipov
 
JavaScript & modern scala backend
JavaScript & modern scala backendJavaScript & modern scala backend
JavaScript & modern scala backendGeeksLab Odessa
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?
Alexey Fyodorov
 
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013Vladimir Ivanov
 
Javascript in modern scala backend. [russian]
Javascript in modern scala backend.  [russian]  Javascript in modern scala backend.  [russian]
Javascript in modern scala backend. [russian] Ruslan Shevchenko
 
Java core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.pptJava core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.ppt
Anton Moiseenko
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
Igor Shkulipa
 
08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри
Roman Brovko
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1Eduard Antsupov
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
Igor Shkulipa
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Fedor Lavrentyev
 
03 - Java. Объекты, классы и пакеты в Java
03 - Java. Объекты, классы и пакеты в Java03 - Java. Объекты, классы и пакеты в Java
03 - Java. Объекты, классы и пакеты в Java
Roman Brovko
 
Модули в Java
Модули в JavaМодули в Java
Модули в Java
Zheka Kozlov
 
Scala for android
Scala for androidScala for android
Scala for android
Alexander Rusin
 
использование Hibernate java persistence.part 1.
использование Hibernate java persistence.part 1.использование Hibernate java persistence.part 1.
использование Hibernate java persistence.part 1.
Asya Dudnik
 
Scala Rock-Painting
Scala Rock-PaintingScala Rock-Painting
Scala Rock-Painting
GlobalLogic Ukraine
 
How IntelliJ IDEA plugin can help you in QA Automation
How IntelliJ IDEA plugin can help you in QA AutomationHow IntelliJ IDEA plugin can help you in QA Automation
How IntelliJ IDEA plugin can help you in QA Automation
Dmitriy Gumeniuk
 

Similar to Курс Java-2016. Занятие 10. Reflection, mock (20)

Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
 
Загрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблейЗагрузчики классов в Java - коллекция граблей
Загрузчики классов в Java - коллекция граблей
 
JavaScript & modern scala backend
JavaScript & modern scala backendJavaScript & modern scala backend
JavaScript & modern scala backend
 
Unsafe: to be or to be removed?
Unsafe: to be or to be removed?Unsafe: to be or to be removed?
Unsafe: to be or to be removed?
 
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
 
Javascript in modern scala backend. [russian]
Javascript in modern scala backend.  [russian]  Javascript in modern scala backend.  [russian]
Javascript in modern scala backend. [russian]
 
Java core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.pptJava core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.ppt
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 
08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
 
Bytecode
BytecodeBytecode
Bytecode
 
Scala On Rest
Scala On RestScala On Rest
Scala On Rest
 
03 - Java. Объекты, классы и пакеты в Java
03 - Java. Объекты, классы и пакеты в Java03 - Java. Объекты, классы и пакеты в Java
03 - Java. Объекты, классы и пакеты в Java
 
Модули в Java
Модули в JavaМодули в Java
Модули в Java
 
Scala for android
Scala for androidScala for android
Scala for android
 
использование Hibernate java persistence.part 1.
использование Hibernate java persistence.part 1.использование Hibernate java persistence.part 1.
использование Hibernate java persistence.part 1.
 
Scala Rock-Painting
Scala Rock-PaintingScala Rock-Painting
Scala Rock-Painting
 
How IntelliJ IDEA plugin can help you in QA Automation
How IntelliJ IDEA plugin can help you in QA AutomationHow IntelliJ IDEA plugin can help you in QA Automation
How IntelliJ IDEA plugin can help you in QA Automation
 

More from 7bits

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

More from 7bits (15)

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