Istnieją różne opinie na temat znaczenia testowania prywatnych metod, np. here i here. Osobiście uważam, że ma to sens, pytanie brzmi: jak to zrobić właściwie. W języku C++ można użyć klasy #define
hack lub utworzyć klasę testową friend
, w języku C# jest InternalsVisibleToAttribute, ale w języku Java musimy albo użyć reflection lub uczynić je "widocznymi do testowania" i annotate them as such w celu wyjaśnienia zamiaru. Wady obu powinny być całkiem jasne.Narzędzie Java do testowania prywatnych metod?
Myślę, że powinno być coś lepszego. Począwszy od
public class Something {
private int internalSecret() {
return 43;
}
}
byłoby miło, aby móc wywoływać metod prywatnych w kodzie testowym jak
@MakeVisibleForTesting Something something = new Something();
Assert.assertEquals(43, something.internalSecret());
tu adnotacja będzie cicho przekształcić wszystkie połączenia do prywatnych metod something
użyciu odbicia. Zastanawiam się, czy może to zrobić Lombok (i zapytam autorów).
Jest całkiem możliwe, że wykonanie tej magii okaże się zbyt skomplikowane, a w każdym razie zajmie to trochę czasu, więc szukam innej alternatywy. Może adnotacji klasę badanego z czymś @Decapsulate
i stosując procesor adnotacji do generowania klasy Decapsulated_Something
patrząc jak
public class Decapsulated_Something {
public Decapsulated_Something(Something delegate) {
this.delegate = delegate
}
public boolean internalSecret() {
// call "delegate.internalSecret()" using reflection
}
...
}
co pozwoliłoby korzystać
Decapsulated_Something something = new Decapsulated_Something(new Something());
Assert.assertEquals(43, something.internalSecret());
Nie mam dużego doświadczenia z adnotacją przetwarzanie, więc pytam najpierw tutaj:
- Jak skomplikowane jest to wdrożenie?
- O czym zapomniałem?
- Co sądzisz o tym w ogóle?
Czy pytasz fir narzędzie, lub jak napisać samemu? – Raedwald
@Raedwald Pytam, jak go rozwiązać. Zużywanie się jest jedną z opcji, ale wymyślanie koła na nowo nie jest jednoznacznie pożądane. – maaartinus