Wie man jeden Fall mit Mockito 1x verspottet https://qiita.com/taka_22/items/0c13aacf6ffbc2c77970 Fortsetzung.
Mockito 1.10.19 PowerMock 1.7.3 JUnit 4.11 Java 1.8.0_151
Behandelt Fälle, in denen abhängige Objekte mit neuen, statischen und privaten Methoden erstellt werden. Basierend auf dem vorherigen Muster haben wir es in die folgenden 12 Muster eingeteilt.
No | Muster | Rückgabetyp der Scheinzielmethode | Mock Range | Scheinbetrieb |
---|---|---|---|---|
7 | Die Klasse, die Sie verspotten möchten, wird mit new generiert | Anders als nichtig | Das ganze | Gibt den angegebenen Rückgabewert zurück |
8 | Die Klasse, die Sie verspotten möchten, wird mit new generiert | Anders als nichtig | Das ganze | Eine Ausnahme auslösen |
9 | Die Klasse, die Sie verspotten möchten, wird mit new generiert | void | Das ganze | Eine Ausnahme auslösen |
10 | Das Scheinziel ist eine statische Methode | Anders als nichtig | Das ganze | Gibt den angegebenen Rückgabewert zurück |
11 | Das Scheinziel ist eine statische Methode | Anders als nichtig | Das ganze | Eine Ausnahme auslösen |
12 | Das Scheinziel ist eine statische Methode | void | Das ganze | Eine Ausnahme auslösen |
13 | Das Scheinziel ist eine private Methode | Anders als nichtig | Das ganze | Gibt den angegebenen Rückgabewert zurück |
14 | Das Scheinziel ist eine private Methode | Anders als nichtig | Das ganze | Eine Ausnahme auslösen |
15 | Das Scheinziel ist eine private Methode | void | Das ganze | Eine Ausnahme auslösen |
16 | Das Scheinziel ist eine private Methode | Anders als nichtig | Nur einige Methoden | Gibt den angegebenen Rückgabewert zurück |
17 | Das Scheinziel ist eine private Methode | Anders als nichtig | Nur einige Methoden | Eine Ausnahme auslösen |
18 | Das Scheinziel ist eine private Methode | void | Nur einige Methoden | Eine Ausnahme auslösen |
DateUtil.java import java.text.SimpleDateFormat; import java.util.Date; public class DateUtil { private Boolean flag; public static String getCurrentDate() { Date d = new Date(); return new SimpleDateFormat("yyyy/MM/dd").format(d); } public static void setCurrentDate(long currentTime) { Date d = new Date(); d.setTime(currentTime); } public String getYYYYMMDDStringWrapper(Date date) throws Exception { return getYYYYMMDDString(date); } private String getYYYYMMDDString(Date date) throws Exception { return new SimpleDateFormat("yyyyMMdd").format(date); } private void setFlag(Boolean flag) throws Exception { this.flag = flag; } }
import static org.powermock.api.mockito.PowerMockito.doThrow; import static org.powermock.api.mockito.PowerMockito.mock; import static org.powermock.api.mockito.PowerMockito.spy; import static org.powermock.api.mockito.PowerMockito.whenNew;
@RunWith(PowerMockRunner.class) @PrepareForTest({ DateUtil.class }) public class PowerMockTest { ...
No.7 Lässt whenNew einen Mock des von new erstellten Objekts zurückgeben.
/**
// Aufnahmephase Date dateMocked = mock(Date.class); whenNew(Date.class).withNoArguments().thenReturn(dateMocked); when(dateMocked.getTime()).thenReturn(expected.getTime());
// Wiederholungsphase String strDate = DateUtil.getCurrentDate();
// Überprüfungsphase assertThat(strDate, is("2015/05/05")); }
No.8 /**
// Wiederholungs- und Überprüfungsphase try { DateUtil.getCurrentDate(); fail(); } catch (RuntimeException e) { assertThat(e.getMessage(), is("aaa")); } }
No.9 /**
// Wiederholungs- und Überprüfungsphase try { DateUtil.setCurrentDate(123456789L); fail(); } catch (RuntimeException e) { assertThat(e.getMessage(), is("bbb")); } }
No.10 Verspotten Sie statische Methoden mit mockStatic.
/**
// Wiederholungs- und Überprüfungsphase assertThat(String.valueOf(true), is("false")); assertThat(String.valueOf(false), is("false")); }
No.11 /**
// Wiederholungs- und Überprüfungsphase try { String.valueOf(true); fail(); } catch (RuntimeException e) { assertThat(e.getMessage(), is("aaa")); } assertNull(String.valueOf(false)); }
No.12 /**
// Wiederholungs- und Überprüfungsphase try { DateUtil.setCurrentDate(12345L); fail(); } catch (RuntimeException e) { assertThat(e.getMessage(), is("bbb")); } }
No.13 Da es das Ganze verspotten wird, wird die verspottete Methode direkt durch Reflexion aufgerufen.
/**
// Wiederholungsphase Method getYYYYMMDDStringMethod = DateUtil.class.getDeclaredMethod("getYYYYMMDDString", Date.class); getYYYYMMDDStringMethod.setAccessible(true); String actual = (String)getYYYYMMDDStringMethod.invoke(dateMocked, new Date());
// Überprüfungsphase assertThat(actual, is("12345678")); }
No.14 /**
// Wiederholungs- und Überprüfungsphase try { Method getYYYYMMDDStringMethod = DateUtil.class.getDeclaredMethod("getYYYYMMDDString", Date.class); getYYYYMMDDStringMethod.setAccessible(true); getYYYYMMDDStringMethod.invoke(dateMocked, new Date()); fail(); } catch (Exception e) { if (e instanceof InvocationTargetException) { InvocationTargetException ite = (InvocationTargetException) e; assertThat(ite.getTargetException().getMessage(), is("aaa")); } else { fail(); } } }
No.15 /**
// Wiederholungs- und Überprüfungsphase Method setFlagMethod = DateUtil.class.getDeclaredMethod("setFlag", Boolean.class); setFlagMethod.setAccessible(true); try { setFlagMethod.invoke(dateMocked, true); fail(); } catch (Exception e) { if (e instanceof InvocationTargetException) { InvocationTargetException ite = (InvocationTargetException) e; assertThat(ite.getTargetException().getMessage(), is("bbb")); } else { fail(); } } }
No.16 Der einzige Unterschied beim Verspotten ist die Verwendung von Spion. Der Rest ist der gleiche wie Nr. 13-15. Es verspottet nicht alles, so dass Sie es mit öffentlichen Methoden testen können. Natürlich ist auch Reflexion möglich. /**
// Wiederholungsphase String strDate = dateMocked.getYYYYMMDDStringWrapper(new Date());
// Überprüfungsphase assertThat(strDate, is("12345678")); }
No.17 /**
// Wiederholungs- und Überprüfungsphase try { dateMocked.getYYYYMMDDStringWrapper(new Date()); fail(); } catch (RuntimeException e) { assertThat(e.getMessage(), is("aaa")); } }
No.18 /**
// Wiederholungs- und Überprüfungsphase Method setFlagMethod = DateUtil.class.getDeclaredMethod("setFlag", Boolean.class); setFlagMethod.setAccessible(true); try { setFlagMethod.invoke(dateMocked, true); fail(); } catch (Exception e) { if (e instanceof InvocationTargetException) { InvocationTargetException ite = (InvocationTargetException) e; assertThat(ite.getTargetException().getMessage(), is("bbb")); } else { fail(); } } }
Mockito http://site.mockito.org/ PowerMock https://github.com/powermock/powermock
https://github.com/taka2/mockito-sample
https://qiita.com/taka_22/items/0c13aacf6ffbc2c77970
Recommended Posts