Kaip testuoti privačius metodus?

Sukuriu klasės biblioteką, kurioje bus keletas viešų ir privačių metodų. Norėčiau sugebėti išbandyti privačius testavimo metodus (daugiausia kuriant, bet taip pat gali būti naudinga atliekant tolesnį refaktoravimą).

Kas yra teisingas būdas tai padaryti?

452
30 окт. nustatė Eric Labashosky 2008-10-30 18:49 '08, 18:49 PM 2008-10-30 18:49
@ 33 atsakymai
  • 1
  • 2

Jei naudojatės.net, turite naudoti „ InternalsVisibleToAttribute“ .

113
30 окт. atsakymas pateikiamas 30kt . 2008-10-30 18:52 '08, 18:52, 2008-10-30 18:52

Jei norite, kad vieneto testas būtų privatus, kažkas gali būti neteisinga. Vieneto testai (paprastai kalbant) yra skirti klasės klasės sąsajai, o tai reiškia jos viešuosius (ir saugomus) metodus. Žinoma, galite „nulaužti“ šio sprendimo sprendimą (net jei tiesiog skelbiate metodus), bet galbūt taip pat manote:

border=0
  • Jei testavimo būdas yra tikrai vertas, verta jį perkelti į savo klasę.
  • Pridėkite daugiau testų prie viešųjų metodų, kurie vadina asmeninį metodą, patikrindami privačiojo metodo funkcijas. (Kaip pažymėjo komentatoriai, tai turėtumėte daryti tik tada, jei šios privačių metodų funkcijos iš tikrųjų yra viešosios sąsajos dalis. Jei jos faktiškai atlieka nuo vartotojo paslėptas funkcijas (pvz., Vieneto testą), tai tikriausiai yra bloga).
335
30 окт. Jeroen Heijmans atsakymas spalio 30 d 2008-10-30 18:54 '08, 18:54, 2008-10-30 18:54

Tikrinti asmeninius metodus gali būti netikslinga. Tačiau kartais taip pat noriu paskambinti privačiais testavimo metodais. Dauguma laiko užkirsti kelią kodo dubliavimui bandymų duomenims generuoti ...

„Microsoft“ pateikia du mechanizmus:

Priedai

  • Eikite į klasės apibrėžimo kodą
  • Dešiniuoju pelės klavišu spustelėkite klasės pavadinimą.
  • Pasirinkite „Sukurti privatų priedą“
  • Pasirinkite projektą, kuriame bus sukurtas prieigos taškas => Dėl to gausite naują klasę, pavadintą foo_accessor. Ši klasė bus dinamiškai generuojama kompiliavimo metu, o visi turimi nariai bus prieinami.

Tačiau mechanizmas kartais yra šiek tiek sunkus, kai reikia keisti pradinės klasės sąsają. Taigi didžiąją laiko dalį vengiu jo naudoti.

PrivateObject klasė Kitas būdas yra naudoti Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject

 // Wrap an already existing instance PrivateObject accessor = new PrivateObject( objectInstanceToBeWrapped ); // Retrieve a private field MyReturnType accessiblePrivateField = (MyReturnType) accessor.GetField( "privateFieldName" ); // Call a private method accessor.Invoke( "PrivateMethodName", new Object[] {} ); 
112
29 окт. atsakymas, pateiktas Seven 29 spalio. 2010-10-29 16:50 '10, 16:50, 2010-10-29 16:50

Aš nesutinku su filosofija, kad „jums turėtų būti įdomu tik išbandyti išorinę sąsają“. Tai šiek tiek panašu į tai, kad automobilių remonto dirbtuvėse turėtų būti atliekami bandymai, kad būtų galima patikrinti, ar ratai sukasi. Taip, galų gale domina išorinis elgesys, bet man patinka mano, privatūs vidiniai testai, kurie bus konkretesni ir tikslesni. Taip, jei aš atkursiu, galbūt turėsiu pakeisti kai kuriuos testus, bet jei tai nėra didžiulis refactoring, man reikia keisti tik keletą, bet tai, kad kiti (pastovūs) vidiniai testai vis dar veikia, yra puikus rodiklis, kad kad refaktoravimas buvo sėkmingas.

Galite pabandyti padengti visas vidaus bylas, naudodami tik viešą sąsają, ir jūs galite teoriškai išbandyti kiekvieną vidinį metodą (arba bent jau viską, kas yra svarbu), naudodamiesi atvira sąsaja, tačiau jums gali tekti atsistoti savarankiškai, kad pasiektumėte tai ir ryšys tarp bandomųjų atvejų, vykstančių per viešą sąsają, ir sprendimo, kurį jie suprojektavo bandymui, interjeras, gali būti sunkus arba neįmanomas. Nurodant individualius testus, užtikrinančius tinkamą vidaus įrangos veikimą, verta atlikti nedidelius pakeitimus, susijusius su rekonstrukcija - bent jau tai buvo mano patirtis. Jei reikia atlikti didelius pakeitimus savo testuose kiekvienam refaktoriui, galbūt tai nėra prasminga, tačiau šiuo atveju gali tekti visiškai peržiūrėti savo dizainą. Geras dizainas turėtų būti pakankamai lankstus, kad būtų galima pritaikyti daugumą pakeitimų be didelių pertvarkymų.

73
19 окт. Atsakyti Darrell Plank Oct 19. 2010-10-19 09:34 '10 ne 9:34 2010-10-19 09:34

Retais atvejais norėjau išbandyti privačias funkcijas, dažniausiai juos pakeitiau apsaugai, ir aš parašiau poklasį su viešai prieinama įvyniojimo funkcija.

Klasė:

 ... protected void APrivateFunction() { ... } ... 

Pogrupis bandymams:

 ... [Test] public void TestAPrivateFunction() { APrivateFunction(); //or whatever testing code you want here } ... 
50
30 окт. Atsakymas į Jason Jackson spalio 30 d 2008-10-30 19:04 '08 19:04 2008-10-30 19:04

Manau, kad reikia užduoti dar svarbesnį klausimą: kodėl bandote išbandyti konkretų metodą? Tai kodo kvapas, kurį bandote išbandyti asmeninį metodą per šios klasės viešąją sąsają, o šis metodas yra privatus, nes tai yra įgyvendinimo detalė. Turėtumėte apsvarstyti tik viešosios sąsajos elgesį, o ne tai, kaip jis įgyvendinamas po dangčiais.

Jei noriu išbandyti privačiojo metodo elgesį, naudojant bendruosius refactorings, aš galiu išgauti savo kodą į kitą klasę (galbūt paketo lygmeniu, kad įsitikintumėte, jog jis nėra viešosios API dalis). Tada aš galiu patikrinti jo elgesį atskirai.

Rekonstravimo rezultatas reiškia, kad privatus metodas dabar yra atskira klasė, kuri bendrai įkūrė pradinę klasę. Jo elgesys bus gerai suprantamas jo paties padalinių testų pagalba.

Tada aš galiu išminuoti savo elgesį, kai bandau išbandyti pradinę klasę, tada sutelkti dėmesį į šios klasės atviros sąsajos elgseną, o ne tikrinti viešosios sąsajos kombinatorinį sprogimą ir visų jo privačių metodų elgesį.

Matau, kad tai panaši į automobilio vairavimą. Kai važiuoju automobiliu, nevažiuoju su gaubtu, todėl matau, kad variklis veikia. Aš pasitikiu sąsaja, kurią suteikia automobilis, būtent apsisukimų skaitiklis ir spidometras, kad žinotų, jog variklis veikia. Aš pasitikiu tuo, kad automobilis tikrai juda, kai paspaudžiu dujų pedalą. Jei noriu išbandyti variklį, galiu atlikti patikrinimus atskirai

Žinoma, privačių metodų testavimas tiesiogiai gali būti paskutinis, jei turite pasenusią programą, bet norėčiau, kad senas kodas būtų reorganizuotas, kad būtų galima atlikti geresnius testus. Michaelas Perceas parašė puikią knygą šiuo klausimu. http://www.amazon.co.uk/Working-Effectively-Legacy-Robert-Martin/dp/0131177052

22
24 окт. spalio 24 d. atsakė Big Kahuna . 2012-10-24 19:30 '12 19:30 val. 2012-10-24 19:30

Asmeniniai tipai, vidiniai ir privatūs nariai dėl kokios nors priežasties, ir dažnai nenorite tiesiogiai su jais susisiekti. O jei tai padarysite, greičiausiai vyksite vėliau, nes nėra jokių garantijų, kad vaikinai, kurie sukūrė šias sąjungas, išgelbės privačias / vidines realizacijas.

Tačiau kartais, kai kompiliuojate kai kurias hacks / studijas arba sukuriate trečiąją šalį, aš galiausiai noriu inicijuoti privačią klasę ar klasę, naudodamas privatų ar vidinį konstruktorių. Arba, kartais, dirbant su iš anksto sukomponuotomis bibliotekomis, kurių negaliu keisti, galų gale rašau kai kuriuos bandymus pagal konkretų metodą.

Taigi, „AccessPrivateWrapper“ pasirodė - http://amazedsaint.blogspot.com/2010/05/accessprivatewrapper-c-40-dynamic.html - tai greita pakuotės klasė, kuri supaprastina darbą su dinaminėmis funkcijomis ir atspindžiais C # 4.0.

Pavyzdžiui, galite sukurti vidinius / asmeninius tipus

  //Note that the wrapper is dynamic dynamic wrapper = AccessPrivateWrapper.FromType (typeof(SomeKnownClass).Assembly,"ClassWithPrivateConstructor"); //Access the private members wrapper.PrivateMethodInPrivateClass(); 
17
25 мая '10 в 10:44 2010-05-25 10:44 atsakymas pateikiamas stebuklingai, gegužės 25 d. 10 val. 10:44 2010-05-25 10:44

Na, galite testuoti asmeninį metodą dviem būdais.

  • galite sukurti „ PrivateObject klasės PrivateObject , sintaksė yra tokia

     PrivateObject obj= new PrivateObject(PrivateClass); //now with this obj you can call the private method of PrivateCalss. obj.PrivateMethod("Parameters"); 
  • Galite naudoti atspindį.

     PrivateClass obj = new PrivateClass(); // Class containing private obj Type t = typeof(PrivateClass); var x = t.InvokeMember("PrivateFunc", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, obj, new object[] { 5 }); 
10
27 марта '12 в 10:51 2012-03-27 10:51 atsakymas pateikiamas Nežinomas kovo 27 d. 12 val. 10:51 2012-03-27 10:51

Taip pat naudoju metodą „InternalsVisibleToAttribute“. Taip pat verta paminėti, kad jei tai yra nepatogu, jei norite, kad jūsų anksčiau privatūs metodai būtų pasiekti vidiniu būdu, tuomet galbūt jiems jokiu būdu neturėtų būti taikomi tiesioginiai vieneto testai.

Galų gale jūs tikrinate savo klasės elgesį, o ne konkretų įgyvendinimą - jūs galite pakeisti pastarąjį nekeičiant pirmojo, o jūsų testai dar turi praeiti.

10
30 окт. atsakymas, kurį pateikė philsquared Oct 30 2008-10-30 18:55 '08, 18:55, 2008-10-30 18:55

Yra dviejų tipų privačių metodų. Statiniai privatūs metodai ir nestatiniai privatūs metodai (pavyzdžių metodai). Toliau pateiktuose 2 straipsniuose paaiškinama, kaip vieneto testavimo metodai yra pavyzdžiai.

8
22 июля '11 в 15:32 2011-07-22 15:32 atsakymą pateikė Venkat liepos 22 d., 11 val. 15:32 2011-07-22 15:32

MS Test turi puikią funkciją, kuri leidžia sukurti privačius narius ir metodus projekte, sukuriant VSCodeGenAccessors failą

 [System.Diagnostics.DebuggerStepThrough()] [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TestTools.UnitTestGeneration", "1.0.0.0")] internal class BaseAccessor { protected Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject m_privateObject; protected BaseAccessor(object target, Microsoft.VisualStudio.TestTools.UnitTesting.PrivateType type) { m_privateObject = new Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject(target, type); } protected BaseAccessor(Microsoft.VisualStudio.TestTools.UnitTesting.PrivateType type) : this(null, type) { } internal virtual object Target { get { return m_privateObject.Target; } } public override string ToString() { return this.Target.ToString(); } public override bool Equals(object obj) { if (typeof(BaseAccessor).IsInstanceOfType(obj)) { obj = ((BaseAccessor)(obj)).Target; } return this.Target.Equals(obj); } public override int GetHashCode() { return this.Target.GetHashCode(); } } 

Su klasėmis, kurios gaminamos iš „BaseAccessor“

pavyzdžiui,

 [System.Diagnostics.DebuggerStepThrough()] [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TestTools.UnitTestGeneration", "1.0.0.0")] internal class SomeClassAccessor : BaseAccessor { protected static Microsoft.VisualStudio.TestTools.UnitTesting.PrivateType m_privateType = new Microsoft.VisualStudio.TestTools.UnitTesting.PrivateType(typeof(global::Namespace.SomeClass)); internal SomeClassAccessor(global::Namespace.Someclass target) : base(target, m_privateType) { } internal static string STATIC_STRING { get { string ret = ((string)(m_privateType.GetStaticField("STATIC_STRING"))); return ret; } set { m_privateType.SetStaticField("STATIC_STRING", value); } } internal int memberVar { get { int ret = ((int)(m_privateObject.GetField("memberVar"))); return ret; } set { m_privateObject.SetField("memberVar", value); } } internal int PrivateMethodName(int paramName) { object[] args = new object[] { paramName}; int ret = (int)(m_privateObject.Invoke("PrivateMethodName", new System.Type[] { typeof(int)}, args))); return ret; } 
8
30 окт. Marcus King atsakymą pateikė spalio 30 d. 2008-10-30 19:10 '08, 7:10 pm, 2008-10-30 19:10

„CodeProject“ yra straipsnis, kuriame trumpai aptariami privačių metodų testavimo privalumai ir trūkumai. Tada pateikiamas refleksijos kodas, leidžiantis pasiekti privačius metodus (panašus į anksčiau pateiktą „Marcus“ prekės ženklą). Vienintelė problema, su kuria susidūriau mėginyje, yra tai, kad kodekse neatsižvelgiama į perkrautus metodus.

Straipsnį galite rasti čia:

http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

5
04 нояб. Atsakymas pateikiamas Pedro 04 lapkričio. 2008-11-04 21:35 '08 at 9:35 2008-11-04 21:35

Bandau nenaudoti kompiliatorių direktyvų, nes jos greitai trukdo darbui. Vienas iš būdų jį sušvelninti, jei jums jų tikrai reikia, yra įdėti į dalinę klasę, o jūsų surinkimas ignoruoja šį .cs failą kurdamas gamybos versiją.

5
30 окт. atsakymas duotas swilliams spalio 30 d 2008-10-30 18:59 '08 18:59 2008-10-30 18:59

Nurodykite juos internal ir naudokite „ InternalsVisibleToAttribute , kad jūsų įrenginio bandymo mazgas galėtų juos matyti.

4
30 окт. James Curran atsakymas spalio 30 d 2008-10-30 18:51 '08, 18:51, 2008-10-30 18:51

Visų pirma, neturėtumėte patikrinti asmeninių kodo metodų. Turėtumėte išbandyti „atvirą sąsają“ arba API, savo klasių viešuosius dalykus. API yra visi viešieji metodai, kuriuos pateikiate išoriniams abonentams.

Taip yra todėl, kad pradėję testuoti savo klasės asmeninius metodus ir vidines dalis, susieti savo klasės (konkrečių dalykų) įgyvendinimą su savo bandymais. Tai reiškia, kad nuspręsite pakeisti savo įgyvendinimo duomenis, taip pat turėsite pakeisti savo testus.

Dėl šios priežasties turėtumėte vengti „InternalsVisibleToAtrribute“.

Čia yra puikus pasakojimas apie Jan Cooper, kuris apima šį klausimą: Ian Cooper: TDD, kur viskas atsitiko.

3
03 июля '14 в 3:49 2014-07-03 03:49 atsakymas pateikiamas cda01 liepos 03 '14, 3:49 2014-07-03 03:49

Kartais naudinga patikrinti privačius pranešimus. Tiesą sakant, kompiliatorius turi tik vieną viešąjį metodą: Kompiliavimas (string outputFileName, params string [] sourceSFileNames). Esu įsitikinęs, kad jūs suprantate, kad būtų sunku išbandyti tokį metodą be jokios paslėptos deklaracijos išbandymo!

Štai kodėl mes sukūrėme „Visual T #“: atlikti lengvesnius testus. Tai nemokama programavimo kalba .NET (suderinama su C # v2.0).

Pridėjome operatorių ..-. Jis elgiasi kaip „.“ operatorius, išskyrus tai, kad taip pat galite pasiekti bet kokį paslėptą skelbimą iš savo bandymų, nekeičiant nieko bandymo projekte.

Pažvelkite į mūsų svetainę: atsisiųskite nemokamai .

3
01 мая '10 в 20:24 2010-05-01 20:24 Atsakymą pateikė Ludovic Dubois gegužės 10 d., 20:24, 2010-05-01 20:24

MbUnit gavo gražią paketą, vadinamą Reflector.

 Reflector dogReflector = new Reflector(new Dog()); dogReflector.Invoke("DreamAbout", DogDream.Food); 

Taip pat galite nustatyti ir gauti vertes iš savybių

 dogReflector.GetProperty("Age"); 

Kalbant apie „viktorinos testą“, sutinku, kad ... idealiame pasaulyje. nėra prasmės daryti privačius testus. Bet realiame pasaulyje, galbūt norėsite parašyti privačius testus, o ne refactoring code.

2
24 авг. Carl Bergquist atsakymas 24 rug. 2009-08-24 10:12 '09 10:12 2009-08-24 10:12

Tiems, kurie nori paleisti asmeninius metodus be jokio fess ir netvarka. Tai veikia su bet kuriais modulio testavimo moduliais, naudojant tik geras senas mintis.

 public class ReflectionTools { // If the class is non-static public static Object InvokePrivate(Object objectUnderTest, string method, params object[] args) { Type t = objectUnderTest.GetType(); return t.InvokeMember(method, BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static, null, objectUnderTest, args); } // if the class is static public static Object InvokePrivate(Type typeOfObjectUnderTest, string method, params object[] args) { MemberInfo[] members = typeOfObjectUnderTest.GetMembers(BindingFlags.NonPublic | BindingFlags.Static); foreach(var member in members) { if (member.Name == method) { return typeOfObjectUnderTest.InvokeMember(method, BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod, null, typeOfObjectUnderTest, args); } } return null; } } 

Tada, atlikdami tikrus testus, galite tai padaryti:

 Assert.AreEqual( ReflectionTools.InvokePrivate( typeof(StaticClassOfMethod), "PrivateMethod"), "Expected Result"); Assert.AreEqual( ReflectionTools.InvokePrivate( new ClassOfMethod(), "PrivateMethod"), "Expected Result"); 
2
16 дек. Atsakymą pateikė Erick Stone 16 gruodis. 2015-12-16 21:32 '15, 21:32 2015-12-16 21:32

Nenuostabu, kad niekas to nepranešė, bet sprendimas, kurį naudoju, yra statinis metodas klasėje, kad galėčiau išbandyti save. Jis suteikia jums prieigą prie visų viešųjų ir privačių, su kuriomis galite patikrinti.

Be to, skriptų kalba (su OO galimybėmis, tokiomis kaip Python, Ruby ir PHP), galite atlikti bandomąją bylą pats paleidžiant. Geras greitas būdas įsitikinti, kad jūsų pakeitimai nieko nepadarė. Tai, žinoma, leidžia keisti visų klasių mastelį: tiesiog paleiskite juos visus. (Taip pat galite tai daryti kitomis kalbomis, kurios yra tuščios pagrindinės, kurios taip pat visada atlieka testus.)

2
06 июня '11 в 12:24 2011-06-06 12:24 atsakymas pateikiamas rubu 06 06 val. 12:24 2011-06-06 12:24

Čia noriu sukurti paprastą kodo, kurį galite naudoti bet kurioje klasėje, kurioje norite išbandyti asmeninį metodą, pavyzdį.

Jūsų bandymo atveju klasė paprasčiausiai apima šiuos metodus ir tada juos taiko, kaip nurodyta.

   private $class_name_of_class_you_want_to_test_private_methods_in;  protected static function getMethod($methodName) { $class = new ReflectionClass('Class_name_of_class_you_want_to_test_private_methods_in'); $method = $class->getMethod($methodName); $method->setAccessible(true); return $method; }  protected function _callMethod($methodName, $params=array()) { $method = self::getMethod($methodName); return $method->invokeArgs($this->class_name_of_class_you_want_to_test_private_methods_in, $params); } 

$ this → _ callMethod ('_ someFunctionName', masyvas (param1, param2, param3));

Tiesiog įveskite parametrus tokia tvarka, kokia jie yra originalioje privačioje funkcijoje.

2
16 июля '15 в 22:34 2015-07-16 22:34 Atsakymą pateikė Damon Hogan liepos 15 d. 15 val. 10.34 val. 2015-07-16 22:34

Aš naudoju PrivateObject klasę. Tačiau, kaip jau minėta, geriau vengti testuoti asmeninius metodus.

 Class target = new Class(); PrivateObject obj = new PrivateObject(target); var retVal = obj.Invoke("PrivateMethod"); Assert.AreEqual(retVal); 
1
21 апр. atsakymas pateikiamas vsapiha 21 balandis 2017-04-21 14:57 '17 at 14:57 pm 2017-04-21 14:57
 CC -Dprivate=public 
1
31 окт. Mark Harrison atsakymas spalio 31 d 2008-10-31 10:44 '08, 10:44, 2008-10-31 10:44

Čia yra geras straipsnis apie privačių metodų testavimą. Bet aš nesu įsitikinęs, ar geriau, jei norite, kad jūsų paraiška būtų specialiai sukurta bandymams (tai yra bandymų bandymų kūrimas) arba bandymų refleksija. Akivaizdu, kad dauguma iš mūsų pasirenka antrąjį kelią.

1
11 апр. Johnny_D atsakymas balandžio 11 d 2012-04-11 18:14 '12 at 18:14 PM 2012-04-11 18:14
1
12 февр. atsakymą pateikė Ruben Bartelink , vasario 12 d. 2010-02-12 12:23 '10, 12:23, 2010-02-12 12:23

Mano nuomone, turėtumėte vieneto testą paskelbti savo viešąją API.

Sukuriant viešą metodą vieneto testavimui, jis sulaužo kapsulę, atskleidžiant įgyvendinimo detales.

Geras viešasis API išsprendžia tiesioginį kliento kodo tikslą ir visiškai išsprendžia šį tikslą.

0
26 нояб. Jpchauny lapkričio 26 d 2016-11-26 17:33 '16 at 17:33 pm 2016-11-26 17:33

Norėdami tai padaryti, turite turėti savo protected metodą ir parašyti testavimo prietaisą, kuris paveldėtų jūsų išbandytą klasę. Taigi jūsų metodas public , bet įjungiate testavimą.

0
22 сент. Atsakymas pateikiamas rugsėjo 22 d 2014-09-22 21:34 '14, 21:34, 2014-09-22 21:34

Galite sukurti testavimo metodą privačiam metodui iš „Visual studio 2008“. Kai sukuriate privataus metodo vieneto testą, į bandomąjį projektą įtraukiamas aplankas Bandymų nuorodos ir prie šio aplanko pridedamas priedas. Prieiga taip pat paminėta vieneto bandymo metodo logikoje. Šis priedas leidžia jūsų vieneto testui naudoti privačius metodus bandomame kode. Daugiau informacijos žr.

http://msdn.microsoft.com/en-us/library/bb385974.aspx

0
28 мая '10 в 23:39 2010-05-28 23:39 atsakė Saratui gegužės 28 d., 10 val. 23:39 2010-05-28 23:39

1) Jei turite pasenusią kodą, vienintelis būdas patikrinti asmeninius metodus yra atspindys.

2) Jei tai naujas kodas, turite šias parinktis:

  • Naudokite atspindį (sudėtingiems)
  • Напишите unit test в том же классе (делает производственный код уродливым с тестовым кодом и в нем)
  • Рефакторинг и сделать метод общедоступным в каком-либо классе утилиты
  • Используйте аннотацию @VisibleForTesting и удалите конфиденциальную