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

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

Upload: 7bits

Post on 11-Feb-2017

275 views

Category:

Education


6 download

TRANSCRIPT

Курс по Java, 2016

Reflection, Mockjava.lang.reflect, Mockito

Курс по Java, 2016

Reflection — отражение

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

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

Курс по Java, 2016

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

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

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

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

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

[email protected] [email protected]