Курс java-2016. Занятие 10. reflection, mock
Post on 11-Feb-2017
275 Views
Preview:
TRANSCRIPT
Курс по 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
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
top related