Beispiel: DB-Mock (1/7)



Ähnliche Dokumente
6. Mocking. Was wann testen Wie werden Klassen testbar Entwicklung von Mocks mit der Hand Einführung in Mockito Wann ist Mocking-Werkzeug sinnvoll

Java Database Connectivity (JDBC) Walther Rathenau Gewerbeschule 1

Allgemein: Klassen testbar machen. 5. Mocking. Mocks programmieren. Zusammenspiel von Klassen testen

Info: Standard DO-178B. 5. Mocking. Zusammenspiel von Klassen testen. Allgemein: Klassen testbar machen

seit Java 1.1 Bestandteil der API: packages java.sql, javax.sql

UNIVERSITÄT ULM Fakultät für Ingenieurswissenschaften und Informatik Institut für Datenbanken und Informationssysteme

JDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann.

Oracle: Abstrakte Datentypen:

SEP 114. Design by Contract

JDBC. Allgemeines ODBC. java.sql. Beispiele

Grundlagen von Datenbanken SS 2010 Kapitel 8: Datenbank-Einbettung in Programmiersprachen Prof. Dr. Stefan Böttcher Universität Paderborn

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Java: Vererbung. Teil 3: super()

Lambda Expressions in Java 8

Fortgeschrittenes Programmieren mit Java. Test Driven Development

Große Übung Praktische Informatik 1

Programmierkurs Java

DB-Programmierung. Lehr- und Forschungseinheit Datenbanken und Informationssysteme 1. Ziele. DB2 Zugriff mit Java selbst programmieren

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

5. Tutorium zu Programmieren

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf

Musterlösungen zur Klausur Informatik 3

Programmieren in Java

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

JDBC. Java DataBase Connectivity

Themen. Web Service - Clients. Kommunikation zw. Web Services

Prinzipien Objektorientierter Programmierung

Datenbanken & Informationssysteme Übungen Teil 1

Javakurs zu Informatik I. Henning Heitkötter

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

7. Übung zu Algorithmen und Datenstrukturen

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

WebService in Java SE und EE

Multi-Threading. Ralf Abramowitsch Vector Informatik GmbH

public class SternchenRechteckGefuellt {

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Java Kurs für Anfänger Einheit 5 Methoden

Einführung in die Programmierung

Tagesprogramm

Test-Driven Design: Ein einfaches Beispiel

Kapitel 10. JDBC und SQLJ. Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 1

2A Basistechniken: Weitere Aufgaben

Objektorientierte Programmierung

Praktikum Informatik II Prof. Dr. Martin Trauth, Dr. Michael Männel

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Variablen manipulieren per JDI

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Client-Server-Beziehungen

Folgendes PL/SQL Codefragment zeigt das grundlegende Statement für diesen Test: Java.

Professionelle Seminare im Bereich MS-Office

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Synchronisation in Java. Invisible Web

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Datenbank und Informationssysteme

Übung Programmierung WS 2007/08 - Blatt 5

Java und Datenbanksysteme Datenbankanbindung mit JDBC

Übung Grundlagen der Programmierung. Übung 05: Arrays. Abgabetermin: xx.xx.xxxx. Java-Programm Testplan Testergebnisse

Remote Method Invocation

5. Abstrakte Klassen

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt

Java - Programmierung - Objektorientierte Programmierung 1

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Testen mit JUnit. Motivation

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

Propädeutikum zur Programmierung

Pragmatik von Programmiersprachen

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Innere Klassen in Java

Software-Engineering Software-Management

Dr. Monika Meiler. Inhalt

II.1.1. Erste Schritte - 1 -

Klausur zur Vorlesung Datenbanksysteme I

Delegatesund Ereignisse

Unsere Webapplikation erweitern

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Universität Augsburg, Institut für Informatik WS 2006/2007 Dr. W.-T. Balke 11. Dez M. Endres, A. Huhn, T. Preisinger Lösungsblatt 7

Programmiervorkurs WS 2012/2013. Schleifen und Methoden

Typumwandlungen bei Referenztypen

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

trivum Multiroom System Konfigurations- Anleitung Erstellen eines RS232 Protokolls am Bespiel eines Marantz SR7005

Programmiervorkurs SS 2011 Technische Universität Darmstadt Jan Hendrik Burdinski, Felix Kerger

Primitive Datentypen

Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Einführung in die Java- Programmierung

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

How to do? Projekte - Zeiterfassung

Nathan Burgener. Design by Contract. Modul SWE

Überblick. Lineares Suchen

SQLJ. Standardisierte Java-DB. DB-Schnittstelle. Spezifikationen. Oracle, IBM, Informix, Sybase,, Tandem, Sun, Microsoft stehen dahinter

Transkript:

Beispiel: DB-Mock (1/7) Aufgabe: DB, auf die vereinfachend nur lesend zugeriffen wird mocken warum: benötigte keine DB-Lizenz, garantiert gleiche Werte ohne aufwändiges reset, kein Zeitverlust durch Verbindungsaufbau Ansatz: Statement-Interface von JDBC mocken Mock in eigene Klasse zur Wiederverwendung auslagern Hinweis: Zur Vereinfachung des Beispiels wird SQL nicht ganz sauber eingesetzt Stephan Kleuker 211

Beispiel: DB-Mock (2/7): Erinnerung JDBC Datenbankverbindung herstellen class DriverManager Connection con= DriverManager.getConnection(...); Statement stmt= con.createstatement(); Datenbankanfrage Ergebnisse verarbeiten Verbindung zur DB schließen ResultSet rs = stmt.executequery(...); rs.next(); int n = rs.getint("knr"); con.close(); Stephan Kleuker 212

Beispiel: DB-Mock (3/7): Programm (1/2) Hinweis: Programm auf Testbarkeit ausgelegt; einfaches Einfügen eines Statement-Objekts package noten; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; public class Statistik { private Statement statement; public Statistik(){ public void setstatement(statement statement){ this.statement=statement; Stephan Kleuker 213

Beispiel: DB-Mock (4/7): Programm (2/2) public double studidurchschnitt(string name) throws SQLException{ int anzahl=0; int summe=0; ResultSet rs= statement.executequery( "SELECT * FROM Noten WHERE Studi ='" + name + "'"); while (rs.next()) { anzahl++; summe += rs.getint(3); if (anzahl == 0) return 0d; else return summe/ (anzahl * 100d); Stephan Kleuker 214

Beispiel: DB-Mock (5/7): Mock-Aufbau (1/2) package noten; import java.sql.resultset; import java.sql.statement; import org.jmock.expectations; import org.jmock.mockery; public class DBMock { public Statement dberstellen() throws Exception { final Mockery context = new Mockery(); final Statement st = context.mock(statement.class); final String[][] pruefungen = { // Beispieltabelle { "Ute", "Prog1", "400", { "Uwe", "Prog1", "230", { "Ute", "Prog2", "170" ; Stephan Kleuker 215

Beispiel: DB-Mock (6/7): Mock-Aufbau (2/2) context.checking(new Expectations() { { final ResultSet r = context.mock(resultset.class,"r"); context.checking(new Expectations() { { oneof(r).next(); will(returnvalue(true)); oneof(r).next(); will(returnvalue(true)); oneof(r).next(); will(returnvalue(false)); oneof(r).getint(3); will(returnvalue(integer.parseint(pruefungen[0][2]))); oneof(r).getint(3); will(returnvalue(integer.parseint(pruefungen[2][2]))); ); allowing(st).executequery( "SELECT * FROM Noten WHERE Studi='Ute'"); ); will(returnvalue(r)); Stephan Kleuker 216

Beispiel: DB-Mock (7/7): Tests (Ausschnitt) public class StatistikTest { private Statement db; private Statistik s; @Before public void setup() throws Exception{ db = new DBMock().dbErstellen(); s = new Statistik(); s.setstatement(db); @Test public void testschnittute() throws SQLException { Assert.assertTrue(2.85 == s.studidurchschnitt("ute")); Stephan Kleuker 217

Alternativwerkzeug Mockito generell: immer wieder nach Alternativen suchen Mockito basierte auf EasyMock (auch Alternative), hat dann eigenen Weg eingeschlagen (https://code.google.com/p/mockito/) Vor Werkzeugvergleich immer Kriterien überlegen, z. B. wirklich benötigter Funktionsumfang unterstützte Technologien Lizenz, Kosten Größe des Entwicklungsteams Dokumentation, Support Kriterien individuell im Projekt gewichten Stephan Kleuker 218

Beispiel: Buchung, Konto, Logging (1/4) import org.mockito.mockito; @Before public void setup() throws Exception { buchung = new Buchung(); @Test public void testistliquide1(){ final Konto k = Mockito.mock(Konto.class); Buchung.logging = Mockito.mock(LogDatei.class); try { buchung.abbuchen(0, k, BETRAG1); Assert.fail("fehlender Abbruch"); catch (BuchungsException e) { Mockito.verify(k).istLiquide(BETRAG1); Mockito.verify(Buchung.logging).schreiben( Direkte Mock- Erstellung; Objekte direkt nutzbar, hier noch keine besonderen Rückgabewerte Prüfung, ob Methoden so aufgerufen "0 abgebrochen, insolvent"); Stephan Kleuker 219

Beispiel: Buchung, Konto, Logging (2/4) @Test public void testistliquide3(){ Konto k = Mockito.mock(Konto.class); Buchung.logging = Mockito.mock(LogDatei.class); Mockito.when(k.istLiquide(BETRAG1)).thenReturn(true); try { Spezifikation des buchung.abbuchen(0, k, BETRAG1); Rückgabewerts catch (BuchungsException e) { (Default false) Assert.fail("nicht erwarteter Abbruch"); //context.assertissatisfied(); Mockito.verify(k).istLiquide(BETRAG1); Mockito.verify(k).abbuchen(BETRAG1); Mockito.verify(Buchung.logging).schreiben("0 bearbeitet"); Stephan Kleuker 220

Beispiel: Buchung, Konto, Logging (3/4) @Test public void testistliquide4(){ final Konto k = Mockito.mock(Konto.class); Buchung.logging = Mockito.mock(LogDatei.class); Mockito.when((k).istLiquide(BETRAG1)).thenReturn(true).thenReturn(false); try { buchung.abbuchen(0, k, BETRAG1); catch (BuchungsException e) { Assert.fail("nicht erwarteter Abbruch"); try { buchung.abbuchen(0, k, BETRAG1); Assert.fail("fehlender Abbruch"); catch (BuchungsException e) { Mockito.verify(k,Mockito.times(2)).istLiquide(BETRAG1); Mockito.verify(k).abbuchen(org.mockito.Matchers.anyInt()); Mockito.verify(Buchung.logging,Mockito.times(2)).schreiben(Mockito.anyString()); mehrere Ergebnisse nacheinander geforderter mehrfacher Methodenaufruf Mockito-Matcher Stephan Kleuker 221

Beispiel: Buchung, Konto, Logging (4/4) import org.hamcrest.matchers; @Test public void testistliquide5(){ Konto k = Mockito.mock(Konto.class); Buchung.logging = Mockito.mock(LogDatei.class); Mockito.when(k.istLiquide(Mockito.intThat(Matchers.greaterThan(42)))).thenThrow(new NumberFormatException()); try { buchung.abbuchen(0, k, 100); Assert.fail("fehlender Abbruch"); catch (NumberFormatException e) { Mockito.verify(k).istLiquide(Mockito.intThat(Matchers.greaterThan(42))); catch (BuchungsException e) { Assert.fail("falsche Exception"); Nutzung von Hamcrest- Matchern Werfen von Exceptions Stephan Kleuker 222

Kleine Verwirrung Mockito hat eigene Matcher-Klasse org.mockito.matchers Mockito.verify(k).abbuchen(org.mockito.Matchers.anyInt()); Hinweis: wenn ein Argument durch Matcher ersetzt, müssen alle ersetzt werden verify(mock).somemethod(anyint(), anystring(), eq("third argument")); Mockito-Matcher ermöglichen auch die Nutzung von Hamrest-Matchern Mockito.verify(k).istLiquide(Mockito.intThat(org.hamcrest.Matchers.greaterThan(42))); Methoden : argthat(.), booleanthat(.), bytethat(.), charthat(.), doublethat(.), floatthat(.), intthat(.), longthat(.), shortthat(.) Stephan Kleuker 223

Spying Möglichkeit Methoden realer Objekte zu verändern sinnvoll bei Legacy-Code oder um Zugriffe auf externe Systeme zu vermeiden public static void main(string[] args) { List<Integer> list = new LinkedList<Integer>(); list.add(1); List<Integer> spy = Mockito.spy(list); Mockito.doReturn(42).when(spy).get(0); System.out.println(spy.get(0) +" :: " + spy.size()); Spy-Erstellung alternative Beschreibung für Ergebnis @SuppressWarnings("unchecked") List<Integer> list2 = Mockito.mock(List.class); 42 :: 1 list2.add(1); 42 :: 0 Mockito.doReturn(42).when(list2).get(0); System.out.println(list2.get(0) +" :: " + list2.size()); Stephan Kleuker 224

Nicht alles kann gemockt werden (JMock, Mockito) public static void main(string[] args) { String s = Mockito.mock(String.class); Mockito.doReturn(42).when(s).length(); System.out.println(s+ " hat Laenge" + s.length()); Exception in thread "main" org.mockito.exceptions.base.mockitoexception: Cannot mock/spy class java.lang.string Mockito cannot mock/spy following: - final classes - anonymous classes - primitive types at MockitoSpielerei.main(MockitoSpielerei.java:8) Stephan Kleuker 225

etwas Spielerei public static void main(string[] args) { BigInteger s = Mockito.mock(BigInteger.class); Mockito.doReturn("42").when(s).toString(); System.out.println("s hat Wert " + s +" :: "+s.longvalue()); BigInteger tt = new BigInteger("1234567890123456789"); BigInteger t = Mockito.spy(tt); Mockito.doReturn("42").when(t).toString(); System.out.println("t hat Wert " + t +" :: "+t.longvalue()); System.out.println(t.getClass()); s hat Wert 42 :: 0 t hat Wert 42 :: 1234567890123456789 class $java.math.biginteger$$enhancerbymockitowithcglib$$8e32a13f Stephan Kleuker 226

weitere Möglichkeiten / Fazit Mockito bietet einige weitere Möglichkeiten, dabei immer teilweise spezielle Randbedingungen beachten http://docs.mockito.googlecode.com/hg/latest/org/mockito/ Mockito.html Mockito etwas einfacher zu nutzen als JMock; insbesondere mehr "normales Java" Mockito und JMock haben kleine Anteile, die der andere nicht kann (man kann beide zusammen einsetzten) generell kritischer Werkzeugvergleich immer sinnvoll; oft auch gemeinsame Nutzung eine Lösung Stephan Kleuker 227