Ano, To je otázka za milion dolarů. Jak jednotkové testování soukromých metod?
měl by vývojář otestovat soukromé metody ve své kódové základně? nebo nechat je na důvěře veřejných metod je způsob. Každý vývojář má svůj vlastní názor, zda bychom je měli skutečně otestovat nebo ne. Tak, ve zkratce, otázka se snížila na: „Existuje nějaký dobrý přístup, který můžeme pro tuto práci vyzkoušet?“
zde jsou všechny možné možnosti, které má vývojář k dispozici pro testování soukromých metod jeho aplikací založených na Java / kotlin v roce 2019:
- testovat privátní metody 😜(Žádné kořeny, žádné kyselé hrozny)
- Dejte metody přístupu veřejnosti 😒 (Ne, nebudu dělat, to je proti kódování postupy. Jsem dobrý vývojář, řídím se osvědčenými postupy)
- použijte vnořenou testovací třídu 😒 (to není dobré smíchat výrobní kód s testovacím kódem. Musím znovu zmínit, že jsem dobrý vývojář a já jsem sledovat pouze osvědčené postupy)
- Použití Java Odraz 😃(Ano, to se zdá zajímavé, že jsem v to)
Navzdory společné přesvědčení, že je skutečně možné, aby přístup k soukromé pole a metody jiných tříd, přes Java Odraz. Není to ani tak těžké. To může být velmi užitečné při testování jednotek.
Poznámka: Toto funguje pouze při spuštění kódu jako samostatné Java aplikace, stejně jako u jednotkových testů a běžných aplikací. Pokusíte-li se to udělat uvnitř Java appletu, budete muset pohrávat s SecurityManager. Ale protože to není něco, co musíte dělat velmi často, je z tohoto textu zatím vynecháno.
metoda Parameter Reflection support byla přidána v Javě 8. Jednoduše řečeno, poskytuje podporu pro získání názvů parametrů za běhu.
přístup K soukromé oblasti, budete muset zavolat na Class.getDeclaredField(String name)
nebo Class.getDeclaredFields()
metoda. Metody Class.getField(String name)
a Class.getFields()
vrací pouze veřejná pole, takže nebudou fungovat. Zde je jednoduchý příklad třídy s privátní oblasti, a dále, že kód pro přístup k této oblasti prostřednictvím Java Odraz:
public class PrivateObject {private String privateString = null;public PrivateObject(String privateString) {
this.privateString = privateString;
}
}PrivateObject privateObject = new PrivateObject("The Private Value");Field privateStringField = PrivateObject.class.
getDeclaredField("privateString");privateStringField.setAccessible(true);String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);
Tento příklad kódu vytiskne text, "fieldValue = The Private Value”
, což je hodnota pro vlastní pole privateString
PrivateObject
instance vytvořené na začátku kódu vzorku.
Všimněte si použití metody PrivateObject.class.getDeclaredField("privateString")
. Toto volání metody vrací soukromé pole. Tato metoda vrací pouze pole deklarovaná v dané třídě, nikoli pole deklarovaná v žádné supertřídě.
Všimněte si také tučně. Voláním Field.setAcessible(true)
vypnete kontroly přístupu pro tuto konkrétní instanci Field
, pouze pro odraz. Nyní k němu máte přístup, i když je soukromý, chráněný nebo balíček, i když volající není součástí těchto oborů. Stále nemůžete přistupovat k poli pomocí normálního kódu. Kompilátor to nedovolí.
Přístup k Soukromé Metody
pro přístup K privátní metodě, budete muset zavolat na Class.getDeclaredMethod(String name, Class parameterTypes)
nebo Class.getDeclaredMethods()
metoda. Metody Class.getMethod(String name, Class parameterTypes)
a Class.getMethods()
metody vracejí pouze veřejné metody, takže nebudou fungovat.
zde je jednoduchý příklad třídy se soukromou metodou a pod ní kód pro přístup k této metodě pomocí Java Reflection:
public class PrivateObject {private String privateString = null;public PrivateObject(String privateString) {
this.privateString = privateString;
}private String getPrivateString(){
return this.privateString;
}
}PrivateObject privateObject = new PrivateObject("The Private Value");Method privateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", null);privateStringMethod.setAccessible(true);String returnValue = (String)
privateStringMethod.invoke(privateObject, null);System.out.println("returnValue = " + returnValue);
Tento příklad kódu vytiskne text, "returnValue = The Private Value”
, což je hodnota vrácená metodou getPrivateString()
při spuštění PrivateObject
instance vytvořené na začátku kódu vzorku.
Všimněte si použití metody PrivateObject.class.getDeclaredMethod("privateString")
. Toto volání metody vrací soukromou metodu. Tato metoda vrací pouze metody deklarované v dané třídě, nikoli metody deklarované v žádné supertřídě.
Všimněte si také tučně. Voláním Method.setAcessible(true)
vypnete kontroly přístupu pro tuto konkrétní instanci Method
, pouze pro odraz. Nyní k němu máte přístup, i když je soukromý, chráněný nebo balíček, i když volající není součástí těchto oborů. Stále nemůžete přistupovat k metodě pomocí normálního kódu. Kompilátor to nedovolí.
zkusme tyto znalosti na nějakém kódu na úrovni výroby.
zde je třída obsahující některé soukromé metody, které chceme otestovat.