├ľzel bir i┼člevi veya ├Âzel y├Ântemleri, alanlar─▒ veya i├ž s─▒n─▒flar─▒ olan bir s─▒n─▒f─▒ nas─▒l test ederim?


Al─▒nan cevaba git


Dahili ├Âzel y├Ântemleri, alanlar─▒ veya i├ž i├že s─▒n─▒flar─▒ olan bir s─▒n─▒f─▒ nas─▒l test ederim (xUnit kullanarak)? Ya da ( C / C ++ dilinde) dahili ba─člant─▒ya sahip olarak static ya da ├Âzel ( anonim ) bir ad alan─▒nda olan ├Âzel bir i┼člev ?

Yaln─▒zca bir testi ger├žekle┼čtirebilmek i├žin bir y├Ântem veya i┼člev i├žin eri┼čim de─či┼čtiricisini de─či┼čtirmek k├Ât├╝ g├Âr├╝n├╝yor.


2562









Cevap say─▒s─▒n─▒ say: 30






G├╝ncelle┼čtirme:

Daha sonra belki ├Âzel bir y├Ântem veya herhangi ula┼č─▒lmaz ├╝yesini s─▒naman─▒n en iyi yolu yakla┼č─▒k 10 y─▒l, yoluylad─▒r @Jailbreak gelen Manifold ├žer├ževe.

 @Jailbreak Foo foo = new Foo();
// Direct, *type-safe* access to *all* foo's members
foo.privateMethod(x, y, z);
foo.privateField = value;
 

Bu ┼čekilde kodunuz g├╝venli ve okunakl─▒ kal─▒r. Tasar─▒m ├Âd├╝n vermek yok, testler u─čruna a┼č─▒r─▒ pozlama y├Ântemleri ve alanlar─▒ yok.

Bir miktar eski Java uygulaman─▒z varsa ve y├Ântemlerin g├Âr├╝n├╝rl├╝─č├╝n├╝ de─či┼čtirmenize izin verilmiyorsa, ├Âzel y├Ântemleri test etmenin en iyi yolu yans─▒ma kullanmakt─▒r .

Dahili olarak almak / ayarlamak private ve private static de─či┼čkenleri, invoke private ve private static y├Ântemleri kullanmak i├žin yard─▒mc─▒lar─▒ kullan─▒yoruz . A┼ča─č─▒daki modeller, ├Âzel y├Ântem ve alanlarla ilgili hemen hemen her ┼čeyi yapman─▒za izin verir. Tabii ki, private static final de─či┼čkenleri yans─▒tma yoluyla de─či┼čtiremezsiniz .

 Method method = TargetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);
 

Ve alanlar i├žin:

 Field field = TargetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);
 

Notlar:
1. Y├Ântemlere TargetClass.getDeclaredMethod(methodName, argClasses) bakman─▒za olanak sa─člar private . Ayn─▒ ┼čey i├žin de ge├žerlidir getDeclaredField .
2. setAccessible(true) ├ľzellerle oynamak gerekir.


1562







├ľzel bir y├Ântemi test etmenin en iyi yolu ba┼čka bir genel y├Ântemdir. Bu yap─▒lamazsa, a┼ča─č─▒daki ko┼čullardan biri do─črudur:

  1. ├ľzel y├Ântem ├Âl├╝ koddur
  2. Test etti─činiz s─▒n─▒fa yak─▒n bir tasar─▒m kokusu var
  3. Test etmeye ├žal─▒┼čt─▒─č─▒n─▒z y├Ântem ├Âzel olmamal─▒d─▒r

574







Bir s─▒n─▒fta, ├Âzel y├Ântemleri do─črudan test etme gere─či duydu─čumda yeterince karma┼č─▒k bir ├Âzel y├Ântemim oldu─čunda, bu bir kod kokusudur: s─▒n─▒f─▒m ├žok karma┼č─▒k.

Bu t├╝r meseleleri ele almak i├žin her zamanki yakla┼č─▒m─▒m, ilgin├ž bitleri i├žeren yeni bir ders vermek. Genellikle, bu y├Ântem ve etkile┼čime girdi─či alanlar ve belki de bir veya iki y├Ântem yeni bir s─▒n─▒fa ├ž─▒kar─▒labilir.

Yeni s─▒n─▒f, bu y├Ântemleri 'genel' olarak ortaya koyar, bu nedenle ├╝nite testi i├žin eri┼čilebilirdir. Yeni ve eski s─▒n─▒flar art─▒k orijinal s─▒n─▒ftan daha basit, bu da benim i├žin harika (i┼čleri basit tutmam gerekiyor veya kaybolmam gerekiyor!).

─░nsanlar─▒n beynini kullanmadan s─▒n─▒f olu┼čturmalar─▒n─▒ ├Ânermedi─čimi unutmay─▒n! Buradaki ama├ž, iyi yeni s─▒n─▒flar bulman─▒za yard─▒mc─▒ olmak i├žin birim test kuvvetlerini kullanmakt─▒r.


301







Ge├žmi┼čte bunu Java i├žin yapmak i├žin yans─▒ma kulland─▒m ve bence bu b├╝y├╝k bir hatayd─▒.

Belirtmek gerekir gerekti─čini, konu┼čan de─čil , do─črudan ├Âzel y├Ântemler test birim testleri yazma. Test etmeniz gereken , s─▒n─▒f─▒n di─čer nesnelerle sahip oldu─ču kamu s├Âzle┼čmesidir; asla bir nesnenin i├ž k─▒s─▒mlar─▒n─▒ do─črudan test etmemelisiniz. Ba┼čka bir geli┼čtirici, s─▒n─▒fa kamu s├Âzle┼čmesini etkilemeyen k├╝├ž├╝k bir i├ž de─či┼čiklik yapmak istiyorsa, ├žal─▒┼čmas─▒n─▒ sa─člamak i├žin yans─▒ma temelli testinizi de─či┼čtirmek zorundad─▒r. Bunu bir proje boyunca tekrar tekrar yaparsan─▒z, birim testleri daha sonra kod sa─čl─▒─č─▒n─▒n yararl─▒ bir ├Âl├ž├╝m├╝ olmay─▒ b─▒rak─▒r ve geli┼čtirme i├žin bir engel ve geli┼čtirme ekibine bir s─▒k─▒nt─▒ olmaya ba┼člar.

Bunun yerine yapmam─▒ istedi─čim, yazd─▒─č─▒n─▒z ├╝nite testlerinin kodun ├Âzel y├Ântemlerde iyi bir ┼čekilde kapsanmas─▒n─▒ sa─člamak i├žin Cobertura gibi bir kod kapsam─▒ arac─▒ kullanmakt─▒r. Bu ┼čekilde, ├Âzel y├Ântemlerin ne yapt─▒─č─▒n─▒ dolayl─▒ olarak test edersiniz ve daha y├╝ksek bir ├ževiklik seviyesini korursunuz.


267







Bu makaleden: ├ľzel Y├Ântemleri JUnit ve SuiteRunner (Bill Venners) ile Test Etmek, temelde 4 se├žene─činiz var:

  • ├ľzel y├Ântemleri test etmeyin.
  • Y├Ântem paketine eri┼čim izni verin.
  • ─░├ž i├že ge├žmi┼č bir test s─▒n─▒f─▒ kullan─▒n.
  • Yans─▒ma kullan─▒n.

204







Genel olarak, bir birim testinin, bir s─▒n─▒f─▒n veya birimin genel aray├╝z├╝n├╝ kullanmas─▒ ama├žlanm─▒┼čt─▒r. Bu nedenle, ├Âzel y├Ântemler a├ž─▒k├ža test etmeyi beklemeyece─činiz uygulama ayr─▒nt─▒lar─▒d─▒r.


118







├ľzel bir y├Ântemi test etmek istedi─čim yerlerden sadece iki tanesi:

  1. ┼×ifre ├ž├Âzme yordamlar─▒ - Bunlar─▒ yaln─▒zca test yapmak amac─▒yla g├Ârmeleri i├žin kimseye g├Âr├╝n├╝r k─▒lmak istemem, yoksa ba┼čkalar─▒ ┼čifresini ├ž├Âzmek i├žin kullanabilir. Ancak, kodun ├Âz├╝d├╝r, karma┼č─▒kt─▒r ve daima ├žal─▒┼čmas─▒ gerekir (bunun istisnas─▒, ├žo─ču durumda, SecurityManager bunu ├Ânlemek i├žin yap─▒land─▒r─▒lmad─▒─č─▒nda ├Âzel y├Ântemleri bile g├Âr├╝nt├╝lemek i├žin kullan─▒labilecek yans─▒mad─▒r ).
  2. Topluluk t├╝ketimi i├žin bir SDK olu┼čturma . Burada halk tamamen farkl─▒ bir anlam kazan─▒yor, ├ž├╝nk├╝ bu b├╝t├╝n d├╝nyan─▒n g├Ârebilece─či bir kod (benim ba┼čvurum i├žin de─čil). Kodlar─▒ SDK kullan─▒c─▒lar─▒n─▒n g├Ârmesini istemiyorsam, ├Âzel y├Ântemlere koyar─▒m - yaln─▒zca SDK programlaman─▒n nas─▒l ├žal─▒┼čt─▒─č─▒n─▒ kod kokusu olarak g├Ârm├╝yorum. Ama tabii ki hala ├Âzel y├Ântemlerimi test etmem gerekiyor ve bunlar SDK'm─▒n i┼člevselli─činin ger├žekte ya┼čad─▒─č─▒ yerler.

Sadece "s├Âzle┼čmeyi" test etme fikrini anl─▒yorum. Ancak birinin test kodu de─čil asl─▒nda savunuculu─čunu yapabilece─čini g├Ârm├╝yorum - kilometreniz de─či┼čebilir.

Bu y├╝zden tradeoff, g├╝venlik ve SDK'm─▒ tehlikeye atmak yerine, JUnits'i yans─▒tma ile karma┼č─▒k hale getirmeyi i├žeriyor.


64







├ľzel y├Ântemlere genel bir y├Ântem denir, bu nedenle genel y├Ântemlere yap─▒lan girdiler de bu genel y├Ântemlerle ├ža─čr─▒lan ├Âzel y├Ântemleri s─▒namal─▒d─▒r. Genel bir y├Ântem ba┼čar─▒s─▒z oldu─čunda, bu, ├Âzel y├Ântemde bir ba┼čar─▒s─▒zl─▒k olabilir.


56







Kulland─▒─č─▒m bir ba┼čka yakla┼č─▒m da ├Âzel veya korumal─▒ paketlemek i├žin ├Âzel bir y├Ântemi de─či┼čtirmek ve ard─▒ndan Google Guava k├╝t├╝phanesinin @VisibleForTesting ek a├ž─▒klamas─▒yla tamamlamak .

Bu, herhangi bir kimseye, bu y├Ântemi kullanan birinin dikkatli olmas─▒ ve bir pakette bile do─črudan eri┼čmemesini s├Âyleyecektir. Ayr─▒ca bir test s─▒n─▒f─▒ fiziksel olarak ayn─▒ pakette de─čil, test klas├Âr├╝ alt─▒nda ayn─▒ pakette olmal─▒d─▒r .

├ľrne─čin, test edilecek bir y├Ântem varsa src/main/java/mypackage/MyClass.java , test ├ža─čr─▒n─▒z yerle┼čtirilmelidir src/test/java/mypackage/MyClassTest.java . Bu ┼čekilde, test s─▒n─▒f─▒n─▒zdaki test y├Ântemine eri┼čebilirsiniz.


35







Eski kodlar─▒ b├╝y├╝k ve ilgin├ž s─▒n─▒flarla test etmek i├žin, ┼ču anda yazd─▒─č─▒m tek bir ├Âzel (veya genel) y├Ântemi test edebilmek genellikle ├žok yararl─▒d─▒r .

Java i├žin junitx.util.PrivateAccessor -package kullan─▒n . ├ľzel y├Ântemlere ve ├Âzel alanlara eri┼čmek i├žin pek ├žok yard─▒mc─▒ tek g├Âmlek.

 import junitx.util.PrivateAccessor;

PrivateAccessor.setField(myObjectReference, "myCrucialButHardToReachPrivateField", myNewValue);
PrivateAccessor.invoke(myObjectReference, "privateMethodName", java.lang.Class[] parameterTypes, java.lang.Object[] args);
 

33







Cem Catikkas'─▒n Java yans─▒mas─▒ kullanarak ├ž├Âz├╝m├╝n├╝ denedikten sonra, burada tarif etti─čimden daha zarif bir ├ž├Âz├╝m oldu─čunu s├Âylemek zorunday─▒m. Ancak, yans─▒ma kullanmaya alternatif ar─▒yorsan─▒z ve test etti─činiz kayna─ča eri┼čiminiz varsa, bu yine de bir se├ženek olacakt─▒r.

Herhangi bir kod yazmadan ├Ânce k├╝├ž├╝k testler tasarlamak istedi─činiz , ├Âzellikle test odakl─▒ bir geli┼čtirme ile bir s─▒n─▒f─▒n ├Âzel y├Ântemlerini test etmekte fayda var .

├ľzel ├╝yelere ve y├Ântemlere eri┼čimi olan bir test olu┼čturmak, ├Âzellikle genel y├Ântemlere eri┼čimi olan ve ├Âzellikle hedeflemesi zor olan kod alanlar─▒n─▒ test edebilir. Bir genel y├Ântemin dahil birka├ž ad─▒m─▒ varsa, daha sonra bireysel olarak test edilebilen birka├ž ├Âzel y├Ântemden olu┼čabilir.

Avantajlar─▒:

  • Daha hassas bir gran├╝lerli─če test edebilir

Dezavantajlar─▒:

  • Test kodu, kaynak kodla ayn─▒ dosyada bulunmal─▒d─▒r; bu, bak─▒m─▒ daha zor olabilir
  • .Class ├ž─▒kt─▒ dosyalar─▒na benzer ┼čekilde, kaynak kodunda belirtilen paket i├žinde kalmalar─▒ gerekir.

Bununla birlikte, s├╝rekli test bu y├Ântemi gerektiriyorsa, geleneksel y├Ântemlerle kamuya a├ž─▒k bir ┼čekilde test edilebilen ├Âzel y├Ântemlerin ├ž─▒kar─▒lmas─▒ gerekti─činin bir i┼čareti olabilir.

─░┼čte bunun nas─▒l i┼če yarayaca─č─▒na dair kapsaml─▒ bir ├Ârnek:

 // Import statements and package declarations

public class ClassToTest
{
    private int decrement(int toDecrement) {
        toDecrement--;
        return toDecrement;
    }

    // Constructor and the rest of the class

    public static class StaticInnerTest extends TestCase
    {
        public StaticInnerTest(){
            super();
        }

        public void testDecrement(){
            int number = 10;
            ClassToTest toTest= new ClassToTest();
            int decremented = toTest.decrement(number);
            assertEquals(9, decremented);
        }

        public static void main(String[] args) {
            junit.textui.TestRunner.run(StaticInnerTest.class);
        }
    }
}
 

─░├ž s─▒n─▒f derlenecekti ClassToTest$StaticInnerTest .

Ayr─▒ca bak─▒n─▒z: Java Tip 106: E─člence ve kazan├ž i├žin statik i├ž s─▒n─▒flar


27







Gelen Bahar Framework bu y├Ântemi kullanarak ├Âzel y├Ântemler test edebilirsiniz:

 ReflectionTestUtils.invokeMethod()
 

├ľrne─čin:

 ReflectionTestUtils.invokeMethod(TestClazz, "createTest", "input data");
 

26







Di─čerlerinin dedi─či gibi ... ├Âzel y├Ântemleri do─črudan test etme. ─░┼čte birka├ž d├╝┼č├╝nce:

  1. T├╝m y├Ântemleri k├╝├ž├╝k ve odaklanm─▒┼č tutun (test edilmesi kolay, yanl─▒┼č olan─▒ bulmak kolay)
  2. Kod kapsam─▒ ara├žlar─▒n─▒ kullan─▒n. Cobertura'y─▒ seviyorum (oh mutlu g├╝nler, yeni bir s├╝r├╝m ├ž─▒kt─▒ gibi g├Âr├╝n├╝yor!)

├ťnite testlerinde kod kapsam─▒n─▒ ├žal─▒┼čt─▒r─▒n. Bu y├Ântemlerin tamamen test edilmedi─čini g├Âr├╝rseniz, kapsam─▒ art─▒rmak i├žin testleri ekleyin. % 100 kod kapsam─▒ hedefleyin, ancak muhtemelen alamayaca─č─▒n─▒z─▒ fark edin.


24







├ľzel y├Ântemler halk taraf─▒ndan t├╝ketilir. Aksi takdirde, onlar ├Âl├╝ koddur. Bu nedenle, kamu y├Ânteminin beklenen sonu├žlar─▒n─▒ ve bunun sonucunda t├╝ketti─či ├Âzel y├Ântemleri iddia ederek, kamu y├Ântemini s─▒nars─▒n─▒z.

├ľzel y├Ântemlerin test edilmesi, birim testlerinizi genel y├Ântemlerde ├žal─▒┼čt─▒rmadan ├Ânce hata ay─▒klama yoluyla test edilmelidir.

Ayr─▒ca, testlere dayal─▒ geli┼čtirme kullanarak hata ay─▒klanabilir, t├╝m iddialar─▒n─▒z kar┼č─▒lan─▒ncaya kadar ├╝nite testlerinde hata ay─▒klayabilirsiniz.

┼×ahsen TDD kullanarak s─▒n─▒f olu┼čturman─▒n daha iyi oldu─čuna inan─▒yorum; genel y├Ântem taslaklar─▒n─▒ olu┼čturmak, ard─▒ndan ├Ânceden tan─▒mlanm─▒┼č olan t├╝m iddialarla birim testleri olu┼čturmak , bu nedenle metodun beklenen sonucu, kodlamadan ├Ânce belirlenir. Bu ┼čekilde, birim test iddialar─▒n─▒ sonu├žlara uyacak ┼čekilde yanl─▒┼č yola sokmazs─▒n─▒z. Daha sonra s─▒n─▒f─▒n─▒z sa─člamd─▒r ve t├╝m ├╝nite testleriniz ge├žti─činde gereksinimleri kar┼č─▒lar.


24







Bahar kullan─▒yorsan─▒z, ReflectionTestUtils , burada en az ├žabayla yard─▒mc─▒ olacak kullan─▒┼čl─▒ ara├žlar sunar. ├ľrne─čin, istenmeyen bir ortak belirleyici eklemek zorunda kalmadan ├Âzel bir ├╝yeye alay etmek i├žin:

 ReflectionTestUtils.setField(theClass, "theUnsettableField", theMockObject);
 

23







─░steksiz veya de─či┼čtiremeyece─činiz mevcut kodu test etmeye ├žal─▒┼č─▒yorsan─▒z, yans─▒ma iyi bir se├žimdir.

S─▒n─▒f─▒n tasar─▒m─▒ hala esnekse ve ayr─▒ ayr─▒ test etmek istedi─činiz karma┼č─▒k bir ├Âzel y├Ânteminiz varsa, ayr─▒ bir s─▒n─▒fa ├ž─▒karman─▒z─▒ ve o s─▒n─▒f─▒ ayr─▒ ayr─▒ test etmenizi ├Âneririm. Bu, orijinal s─▒n─▒f─▒n ortak aray├╝z├╝n├╝ de─či┼čtirmek zorunda de─čildir; dahili olarak yard─▒mc─▒ s─▒n─▒f─▒n bir ├Ârne─čini olu┼čturabilir ve yard─▒mc─▒ y├Ântemi ├ža─č─▒rabilir.

Yard─▒mc─▒ y├Ântemden gelen zor hata ko┼čullar─▒n─▒ test etmek istiyorsan─▒z, bir ad─▒m daha ileri gidebilirsiniz. Yard─▒mc─▒ s─▒n─▒ftan bir arabirim ├ž─▒kar─▒n, yard─▒mc─▒ s─▒n─▒f─▒ (arabiriminden kullan─▒l─▒r) enjekte etmek i├žin orijinal s─▒n─▒fa ortak bir al─▒c─▒ ve ayarlay─▒c─▒ ekleyin ve sonra yard─▒mc─▒ s─▒n─▒f─▒n sahte bir s├╝r├╝m├╝n├╝ orijinal s─▒n─▒f─▒n nas─▒l oldu─čunu test etmek i├žin orijinal s─▒n─▒fa enjekte edin yard─▒mc─▒dan istisnalara yan─▒t verir. Bu yakla┼č─▒m, yard─▒mc─▒ s─▒n─▒f─▒ da s─▒namadan orijinal s─▒n─▒f─▒ s─▒namak istiyorsan─▒z yararl─▒d─▒r.


22







├ľzel y├Ântemleri test etmek, s─▒n─▒f─▒n─▒z─▒n kaps├╝llenmesini bozar, ├ž├╝nk├╝ dahili uygulamay─▒ her de─či┼čtirdi─činizde m├╝┼čteri kodunu ├ži─čnersiniz (bu durumda testleri).

Bu y├╝zden ├Âzel y├Ântemleri test etmeyin.


17







JUnit.org SSS sayfas─▒ndan cevap :

Ama e─čer yapmal─▒s─▒n ...

JDK 1.3 veya daha ├╝st├╝n├╝ kullan─▒yorsan─▒z, eri┼čim kontrol mekanizmas─▒n─▒ PrivilegedAccessor'un yard─▒m─▒ ile alt├╝st etmek i├žin yans─▒ma kullanabilirsiniz . Nas─▒l kullan─▒laca─č─▒ hakk─▒nda ayr─▒nt─▒l─▒ bilgi i├žin, bu makaleyi okuyun .

JDK 1.6 veya daha ├╝st├╝n├╝ kullan─▒yorsan─▒z ve testlerinizi @Test ile a├ž─▒klarsan─▒z, Dp4j'yi test y├Ântemlerine yans─▒ma enjekte etmek i├žin kullanabilirsiniz . Nas─▒l kullan─▒laca─č─▒ hakk─▒nda ayr─▒nt─▒lar i├žin, bu test komut dosyas─▒na bak─▒n .

PS Dp4j'nin ana kat─▒l─▒mc─▒s─▒ benim , yard─▒ma ihtiyac─▒n─▒z olup olmad─▒─č─▒n─▒ bana sorun . :)


16







Kodu de─či┼čtiremeyece─činiz eski bir uygulaman─▒n ├Âzel y├Ântemlerini test etmek istiyorsan─▒z, Java i├žin bir se├ženek jMockit'tir ; bu, s─▒n─▒fa ├Âzel olsalar bile bir nesneye alay olu┼čturman─▒za olanak tan─▒r.


16







├ľzel y├Ântemleri denememe e─čilimindeyim. Delilik yat─▒yor. ┼×ahsen, yaln─▒zca kamuya a├ž─▒k arabirimlerinizi (ve korunan ve dahili y├Ântemleri i├žeren) test etmeniz gerekti─čine inan─▒yorum.


14







JUnit kullan─▒yorsan─▒z, junit-addons'a bak─▒n . Java g├╝venlik modelini g├Ârmezden gelme ve ├Âzel y├Ântem ve niteliklere eri┼čme yetene─čine sahiptir.


14







├ľzel bir y├Ânteme yaln─▒zca ayn─▒ s─▒n─▒fta eri┼čilebilir. Bu nedenle, herhangi bir test s─▒n─▒f─▒ndan bir hedef s─▒n─▒f─▒n ÔÇť├ÂzelÔÇŁ y├Ântemini test etmenin bir yolu yoktur. Bunun bir yolu, manuel olarak birim s─▒namas─▒ yapabilir veya y├Ânteminizi "├Âzel" den "korumal─▒" ya de─či┼čtirebilirsin.

Ve sonra korumal─▒ bir y├Ânteme yaln─▒zca s─▒n─▒f─▒n tan─▒mland─▒─č─▒ paket i├žerisinde eri┼čilebilir. Bu nedenle, bir hedef s─▒n─▒f─▒n korumal─▒ bir y├Ântemini test etmek, test s─▒n─▒f─▒n─▒z─▒ hedef s─▒n─▒fla ayn─▒ pakette tan─▒mlamam─▒z gerekti─či anlam─▒na gelir.

Yukar─▒dakilerin t├╝m├╝ gereksiniminize uymuyorsa , ├Âzel y├Ânteme eri┼čmek i├žin yans─▒ma yolunu kullan─▒n.


12







Kodunuzu biraz de─či┼čtirmenizi ├Âneririm. Yans─▒ma veya ba┼čka t├╝r ┼čeyler kullanmay─▒ d├╝┼č├╝nmeye ba┼člaman─▒z gerekti─činde, yaln─▒zca kodunuzu test etmek i├žin kodunuzda bir sorun var.

Farkl─▒ sorunlardan bahsettiniz. ├ľzel alanlarla ba┼člayal─▒m. ├ľzel alanlar s├Âz konusu oldu─čunda yeni bir kurucu ekler ve bunun ├╝zerine enjekte edilmi┼č alanlar eklerdim. Bunun yerine:

 public class ClassToTest {

    private final String first = "first";
    private final List<String> second = new ArrayList<>();
    ...
}
 

Bunu kullan─▒rd─▒m:

 public class ClassToTest {

    private final String first;
    private final List<String> second;

    public ClassToTest() {
        this("first", new ArrayList<>());
    }

    public ClassToTest(final String first, final List<String> second) {
        this.first = first;
        this.second = second;
    }
    ...
}
 

Bu, baz─▒ eski kodlarda bile sorun olmaz. Eski kod bo┼č bir kurucu kullan─▒yor olacak ve e─čer bana sorarsan─▒z, yeniden yap─▒lanm─▒┼č kod daha temiz g├Âz├╝kecek ve gerekli de─čerleri yans─▒ma yapmadan test edebileceksiniz.

┼×imdi ├Âzel y├Ântemler hakk─▒nda. Benim ki┼čisel deneyimime g├Âre, test i├žin ├Âzel bir y├Ântemi kullanman─▒z gerekti─činde, o zaman bu y├Ântemin o s─▒n─▒fta yapaca─č─▒ hi├žbir ┼čey yoktur. Bu durumda, ortak bir kal─▒p, onu bir arabirim i├žine sarmak gibi olur Callable ve sonra o arabirime ayn─▒ zamanda yap─▒c─▒ya da ge├žersiniz (bu ├žoklu yap─▒c─▒ numaras─▒yla):

 public ClassToTest() {
    this(...);
}

public ClassToTest(final Callable<T> privateMethodLogic) {
    this.privateMethodLogic = privateMethodLogic;
}
 

Yazd─▒─č─▒m ├žo─ču ┼čey bir ba─č─▒ml─▒l─▒k enjeksiyon modeli gibi g├Âr├╝n├╝yor. Ki┼čisel deneyimlerime g├Âre test yaparken ger├žekten faydal─▒d─▒r ve bu t├╝r bir kodun daha temiz ve bak─▒m─▒ kolay olaca─č─▒n─▒ d├╝┼č├╝n├╝yorum. Ayn─▒ i├ž i├že dersler i├žin de ayn─▒s─▒n─▒ s├Âyleyebilirim. ─░├ž i├že ge├žmi┼č bir s─▒n─▒f yo─čun bir mant─▒k i├žeriyorsa, onu ├Âzel bir paket olarak ta┼č─▒man─▒z ve ihtiya├ž duyan bir s─▒n─▒fa enjekte etmeniz daha iyi olur.

Eski kodlar─▒ yeniden d├╝zenlerken ve bak─▒m─▒n─▒ yaparken kulland─▒─č─▒m birka├ž tasar─▒m deseni daha var, ancak bunlar─▒n t├╝m├╝ test edilecek kod durumlar─▒na ba─čl─▒. Yans─▒may─▒ kullanmak ├žo─čunlukla bir sorun de─čildir, ancak yo─čun bir ┼čekilde test edilmi┼č ve her da─č─▒t─▒mdan ├Ânce her ┼čey ger├žekten yava┼člamadan ├Ânce testler yap─▒lm─▒┼č bir kurumsal uygulaman─▒z oldu─čunda (sadece can s─▒k─▒c─▒ ve bu t├╝r ┼čeylerden ho┼članm─▒yorum).

Setter enjeksiyonu da var, ama kullanman─▒ tavsiye etmem. Bir yap─▒c─▒ya ba─čl─▒ kalmal─▒y─▒m ve gerekli oldu─čunda her ┼čeyi ba┼člatmal─▒y─▒m, bu da gerekli ba─č─▒ml─▒l─▒klar─▒ enjekte etme ihtimalini b─▒rak─▒yordu.


12







Yukar─▒dakilerin ├žo─čunun ├Ânerdi─či gibi, bunlar─▒ kamuya a├ž─▒k aray├╝zleriniz ├╝zerinden test etmenin iyi bir yolu var.

Bunu yaparsan─▒z, ├Âzel y├Ântemlerin asl─▒nda testlerinizden uygulan─▒p uygulanmad─▒─č─▒n─▒ g├Ârmek i├žin bir kod kapsam─▒ arac─▒ (Emma gibi) kullanmak iyi bir fikirdir.


11







├ľzel alanlar─▒ s─▒namak i├žin benim genel i┼člevim:

 protected <F> F getPrivateField(String fieldName, Object obj)
    throws NoSuchFieldException, IllegalAccessException {
    Field field =
        obj.getClass().getDeclaredField(fieldName);

    field.setAccessible(true);
    return (F)field.get(obj);
}
 

11







L├╝tfen bir ├Ârnek i├žin a┼ča─č─▒ya bak─▒n;

A┼ča─č─▒daki import ifadesi eklenmeli:

 import org.powermock.reflect.Whitebox;
 

Art─▒k ├Âzel y├Ântemi olan nesneyi, ├ža─čr─▒lacak y├Ântem ad─▒n─▒ ve a┼ča─č─▒daki gibi ek parametreleri do─črudan iletebilirsiniz.

 Whitebox.invokeMethod(obj, "privateMethod", "param1");
 

10







Bug├╝n, ├Âzel y├Ântemleri ve alanlar─▒ test etmek i├žin bir Java k├╝t├╝phanesini zorlad─▒m. Android d├╝┼č├╝n├╝lerek tasarlanm─▒┼čt─▒r, ancak ger├žekten herhangi bir Java projesi i├žin kullan─▒labilir.

├ľzel y├Ântemler veya alanlar veya yap─▒c─▒lar ile ilgili bir kodunuz varsa, BoundBox'─▒ kullanabilirsiniz . Tam olarak arad─▒─č─▒n─▒z─▒ yapar. A┼ča─č─▒da, test etmek i├žin Android etkinli─činin iki ├Âzel alan─▒na eri┼čen bir test ├Ârne─či verilmi┼čtir:

 @UiThreadTest
public void testCompute() {

    // Given
    boundBoxOfMainActivity = new BoundBoxOfMainActivity(getActivity());

    // When
    boundBoxOfMainActivity.boundBox_getButtonMain().performClick();

    // Then
    assertEquals("42", boundBoxOfMainActivity.boundBox_getTextViewMain().getText());
}
 

BoundBox , ├Âzel / korumal─▒ alanlar─▒, y├Ântemleri ve yap─▒c─▒lar─▒ test etmeyi kolayla┼čt─▒r─▒r. Kal─▒t─▒m─▒n saklad─▒─č─▒ ┼čeylere bile eri┼čebilirsiniz. Ger├žekten, BoundBox enkaps├╝lasyonu keser. T├╝m bunlara yans─▒ma yoluyla eri┼čebilmenizi sa─člar, ancak her ┼čey derleme zaman─▒nda kontrol edilir.

Baz─▒ eski kodlar─▒ test etmek i├žin idealdir. Dikkatli kullan. ;)

https://github.com/stephanenicolas/boundbox


10







─░lk ├Ânce, bu soruyu ortaya ├ž─▒karaca─č─▒m: ├ľzel ├╝yelerinizin neden izole edilmi┼č testlere ihtiyac─▒ var? Kamusal y├╝zeyin d─▒┼č─▒nda test edilmesini gerektiren karma┼č─▒k davran─▒┼člar sa─člayan o kadar karma┼č─▒k m─▒lar? Birim testi, 'kod sat─▒r─▒' testi de─čil. K├╝├ž├╝k ┼čeyleri terleme.

Bu kadar b├╝y├╝klerse, bu ├Âzel ├╝yelerin her birinin karma┼č─▒kl─▒k a├ž─▒s─▒ndan b├╝y├╝k bir '├╝nite' olacak kadar b├╝y├╝k olmas─▒ - bu ├Âzel ├╝yelerin bu s─▒n─▒ftan ├ž─▒kar─▒lmas─▒n─▒ d├╝┼č├╝n├╝n.

Yeniden yap─▒lanma uygun de─čilse veya olanaks─▒zsa, ├╝nite testi alt─▒ndayken bu ├Âzel ├╝ye i┼člevlerine / ├╝ye s─▒n─▒flar─▒na eri┼čimi de─či┼čtirmek i├žin strateji modelini kullanabilir misiniz? Birim testi alt─▒nda, strateji daha fazla do─črulama sa─člayacakt─▒r, ancak s├╝r├╝mlerde basit ge├ži┼č olacakt─▒r.


8







Yak─▒n zamanda bu problemi ya┼čad─▒m ve Java yans─▒ma API'sini a├ž─▒k├ža kullanman─▒n sorunlar─▒n─▒ ├Ânleyen Picklock adl─▒ k├╝├ž├╝k bir ara├ž yazd─▒m , iki ├Ârnek:

├ça─čr─▒ y├Ântemleri, ├Ârne─čin private void method(String s) - Java yans─▒mas─▒ ile

 Method method = targetClass.getDeclaredMethod("method", String.class);
method.setAccessible(true);
return method.invoke(targetObject, "mystring");
 

├ça─čr─▒ y├Ântemleri, ├Ârne─čin private void method(String s) - Picklock ile

 interface Accessible {
  void method(String s);
}

...
Accessible a = ObjectAccess.unlock(targetObject).features(Accessible.class);
a.method("mystring");
 

Alanlar─▒n ayarlanmas─▒, ├Ârne─čin private BigInteger amount; - Java yans─▒mas─▒ ile

 Field field = targetClass.getDeclaredField("amount");
field.setAccessible(true);
field.set(object, BigInteger.valueOf(42));
 

Alanlar─▒n ayarlanmas─▒, ├Ârne─čin private BigInteger amount; - Picklock ile

 interface Accessible {
  void setAmount(BigInteger amount);
}

...
Accessible a = ObjectAccess.unlock(targetObject).features(Accessible.class);
a.setAmount(BigInteger.valueOf(42));
 

8







Java i├žin yans─▒ma kullan─▒r─▒m , ├ž├╝nk├╝ yaln─▒zca sake amac─▒yla bir pakete eri┼čimi ilan etme y├Ântemini de─či┼čtirme fikrinden ho┼članm─▒yorum. Ancak, genellikle sadece ├Âzel y├Ântemlerin do─čru ├žal─▒┼čt─▒─č─▒ndan emin olmas─▒ gereken ortak y├Ântemleri de test ederim.

yans─▒ma ├Âzelli─čini, sahibi s─▒n─▒f─▒n d─▒┼č─▒ndan ├Âzel y├Ântemler elde etmek i├žin kullanamazs─▒n─▒z, ├Âzel de─či┼čtirici yans─▒may─▒ da etkiler.

Bu do─čru de─čil. Cem Catikkas'─▒n cevab─▒nda belirtildi─či gibi kesinlikle yapabilirsiniz .


6



─░lgili yay─▒nlar


├ľzel y├Ântemleri mi yoksa yaln─▒zca halka a├ž─▒k olanlar─▒ m─▒ test etmeliyim? [kapal─▒]

Bir y├Ântemin d├Ân├╝┼č t├╝r├╝n├╝n s─▒n─▒f─▒n kendisiyle ayn─▒ oldu─čunu nas─▒l belirtirim?

Ok fonksiyonlar─▒ (ortak s─▒n─▒f alanlar─▒) s─▒n─▒f y├Ântemleri olarak nas─▒l kullan─▒l─▒r?

Sadece korumal─▒ veya ├Âzel yap─▒c─▒lar─▒n bulundu─ču bir s─▒n─▒fta :: std :: make_shared'i nas─▒l ├ža─č─▒r─▒r─▒m?

Java'da t├╝retilmi┼č bir s─▒n─▒fta ge├žersiz k─▒lma y├Ânteminden bir temel s─▒n─▒f─▒n y├Ântemini nas─▒l ├ža─č─▒r─▒r─▒m?

PHP'de Yuvalanm─▒┼č veya ─░├ž S─▒n─▒f

Neden Aray├╝zlerde statik y├Ântem yoktur, fakat statik alanlar ve i├ž s─▒n─▒flar TAMAM? [Java8 ├Âncesi] [kopya]

Java neden i├ž s─▒n─▒flardaki statik alanlar─▒ yasakl─▒yor?

├ľzel / korumal─▒ y├Ântemleri olan bir aray├╝ze sahip olmak m├╝mk├╝n m├╝?

Pex'e somut uygulamalar─▒ olan soyut bir s─▒n─▒f─▒ saplamamas─▒ nas─▒l s├Âylenir

Etiketle ilgili di─čer sorular [java]


JUnit 4 testlerinde belirli bir istisna at─▒ld─▒─č─▒n─▒ nas─▒l iddia ediyorsunuz?

Python's stdlib'i kullanarak yerel IP adreslerini bulma

Tam zaman─▒nda bir (JIT) derleyicisi ne i┼če yar─▒yor?

Razor'da yerel bir de─či┼čken nas─▒l bildirilir?

GitHub'da bir taahh├╝t mesaj─▒ nas─▒l aran─▒r?

Python'da Python kodunu i├žeren bir dize nas─▒l y├╝r├╝tebilirim?

PHP'de bir REST API'sini ├ža─č─▒r─▒n

String.replace i├žine regex giri┼či nas─▒l yap─▒l─▒r?

Boole de─čerini SQLiteÔÇÖde saklay─▒n

Verilen bir sat─▒r i├žin JSHint uyar─▒s─▒n─▒ bast─▒rman─▒n bir yolu var m─▒?