Top Banner
Курс по Java, 2016 Reflection, Mock java.lang.reflect, Mockito
24

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

Feb 11, 2017

Download

Education

7bits
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Курс Java-2016. Занятие 10. Reflection, mock

Курс по Java, 2016

Reflection, Mockjava.lang.reflect, Mockito

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

Курс по Java, 2016

Reflection — отражение

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

Курс по Java, 2016

java.lang.ClassClass<String> clazz = String.class;

String s = "abc";Class<? extends String> clazz = s.getClass();

Class<?> clazz = Class.forName("java.lang.String");

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

Курс по Java, 2016

java.lang.ClassLoaderClassLoader loader = clazz.getClassLoader();ClassLoader loader = ClassLoader.getSystemClassLoader();

Class<?> newClazz = loader.loadClass("it.sevenbits.MyClass");Class<?> newClazz = Class.forName("it.sevenbits.MyClass", true, loader);

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

Курс по Java, 2016

Что JVM делает с .class

http://blog.jamesdbloom.com/JVMInternals.html

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

Курс по Java, 2016

Свой ClassLoaderclass 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 }}

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

Курс по Java, 2016

Создание объектаClass<String> clazz = String.class;

String emptyString = clazz.newInstance(); // ""

Только конструктор по умолчанию

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

Курс по 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);

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

Курс по Java, 2016

КонструкторыConstructor nonPublicConstructor = clazz.getDeclaredConstructor();Constructor[] publicConstructors = clazz.getConstructors();Constructor[] allConstructors = clazz.getDeclaredConstructors();

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

Курс по 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);

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

Курс по Java, 2016

МетодыMethod nonPublicMethod = clazz.getDeclaredMethod("clone");

Method[] publicMethods = clazz.getMethods();

Method[] allMethods = clazz.getDeclaredMethods();

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

Курс по 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);

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

Курс по 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);

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

Курс по Java, 2016

ИсключенияClassNotFoundException — не найдено класса

InstantiationException — не удалось создать объект

NoSuchMethodException — нет такого метода (или конструктора)

NoSuchFieldException — нет такого поля

IllegalAccessException — нет доступа к методу или полю (private)

InvocationTargetException — не получилось вызвать метод

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

Курс по Java, 2016

Reflection может быть медленным

http://ashkrit.blogspot.ru/2013/01/java-reflection-facts.html

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

Курс по Java, 2016

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

Курс по Java, 2016

Mockito<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.10.19</version> <scope>test</scope></dependency>

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

Курс по Java, 2016

Создать заглушкуimport static org.mockito.Mockito.*;

IReader mockReader = mock(IReader.class);

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

Курс по Java, 2016

Определить поведение заглушки// возврат значенияwhen(mockReader.read()).thenReturn('a', 'b', 'c');

// выброс исключенияdoThrow(Exception.class).when(mockReader).close();

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

Курс по 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));

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

Курс по 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();

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

Курс по Java, 2016

Проверка вызовов заглушки// read() вызван ровно 3 разаverify(mockReader, times(3)).read();

// readArray вызван один раз с каким-то char[]verify(mockReader).readArray(any(char[].class));

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

Курс по Java, 2016

Алгоритм работы с заглушками// создание заглушкиIReader mockReader = mock(IReader.class);// определение поведения (если нужно)when(mockReader.read()).thenReturn('a');// использованиеassertEquals('a', mockReader.read());// проверка вызовов (если нужно)verify(mockReader).read();

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

Курс по Java, 2016

Домашнее заданиеНаписать тесты на все реализации потоков, используя Mockito.

Можно ли написать тесты на интерфейсы, чтобы проверять любую новую реализацию, не написав для нее ни одного нового теста?

[email protected] [email protected]