úterý 29. září 2009

Mocking predecessors in Java

Mocking is a practice which allow to test some class without testing its dependencies - the dependencies are mocked. Different mocking libraries are able to mock interface or class quite easy, but there is no library to mock the predecessor of tested class. It's reasonable, because the Java doesn't allow to do something what I'm going to show you by general way.

To show the principle, assume we have following classes (note the example is artificial - not real):

AbstractBuilder and TransactionBuilder

 1:public abstract class AbstractBuilder {
2: protected Transaction createSimpleFromToTransaction(String from, String to) {
3: // something complex here
4: }
5:}
6:
7:public class TransactionBuilder extends AbstractBuilder {
8: // ... constructor
9: public Transaction buildTransaction() {
10: // i.e. some from and to computing
11: return createSimpleFromToTransaction(from, to);
12: }
13:
14:}



There is common method createSimpleFromToTransaction() implemented in AbstractBuilder. The implementation is quite complex and has a lot of dependencies. Let's assume this method is already well tested using huge mocking in another test. Now we would like to test TransactionBuilder.buildTransaction(), we know this method should use createSimpleFromToTransaction(), so to test it properly by regular way, we need to do that huge mocking (used in predecessor test) again - but in fact it is redundant, because the createSimpleFromToTransaction() is already tested.

That's the case we can do something like "mocking the predecessor". Let's see the code:

 1:@Test
2:public void testBuild() {
3: final Transaction transaction = new Transaction();
4: TransactionBuilder underTest = new TransactionBuilder("ME", "THEM") {
5:
6: @Override
7: public Transaction createSimpleFromToTransaction(String from, String to) {
8: assertEquals("ME", from);
9: assertEquals("THEM", from);
10: return transaction;
11: }
12: };
13:
14: assertSame(transaction, underTest.buildTransaction());
15:}



As you can see, we are extending the tested class and overriding method of its predecessor. This allows us to avoid redundant testing of common method (already tested). In addition we can place some asserts into "mocked" method i.e. to check the parameters set.

pondělí 28. září 2009

Umyté ruce za milión

Rád bych doplnil je krátkou, ale dle mého názoru podstatnou myšlenku ke kauze "zákon za milion". Nejzajímavější (a nejsmutnější) na celé kauze totiž je, jak si strany nad svýmy špatnými straníky hned a rychle umyly ruce.

Zkusme se zamyslet a snad trochu vcítit do kůže pana Šustra neba pana Dolejše. Pokud by běžnou praxí ve straně bylo úplatky odmítat a hříšníky, jež na ně kývnou trestat, opravdu bychom riskovali vlivné postavení, teplé místečko a prestiž ve straně za pouhý milión? Obávám se že běžná praxe bude naopak zcela odlišná a smutnější - totiž že brát úplatky je zcela běžné a že do konce existují lidé, kteří tímto způsobem získavají prestiž a vliv ve své straně. Toto je samozřejmě spekulace. Ta se však nabízí také díky rychlosti a způsobu jakým si strany nad hříšníky rychle umyly ruce (ale pozor, teprve v okamžiku kdy se to provalilo).

Myslím, že se to mělo nechat zajít dál a potopit nejen pár jedinců, ale celé strany. Přinést důkaz, že to roste až nahoru. A kdyby nerostlo? Tak tím líp!!

sobota 26. září 2009

(Ne)splněná očekávání (aneb jak být ve všem skvělý)

Nedávno mě zaujal článek o tom jak dlouho trvá panu Bémovi než odpoví. Docela mi to připomnělo jednu starou známou poučku o očekáváních a jejich naplnění.

Nevytvářejte očekávání, která nesplníte. Raději slevte z očekávání a pak můžete příjemně překvapit, když očekávání předčíte.

Konkrétně v daném článku Londýn na rovinu řekl, že odpověď potrvá 20 dní - tím vytvořil nějaké očekávání. Redaktor asi nebyl nadšen, že bude čekat 20 dní. Co se ale nestalo - odpověď přišla mnohem dříve, tím byla očekávání překonána, redaktor příjemně překvapen a tudíž spokojen. Naproti tomu Praha opakovaně vytvářela nesplnitelná očekávání, že odpověď bude za týden. Redaktor byl opakovaně zklamáván a ve výsledku zřejmě i docela naštvaný.

Bohužel je třeba konstatovat, že v česku se s touhletou chybou setkáváme každý několikrát denně - dělá to vaše rodina, vaši známí, podřízení, spolupracovníci, politici, stát. Zřejmě tenhle základní princip úspěšného chování ještě nikdy nikdo neslyšel.

Zkuste se podle něj chovat a předávejte ho dál a možná jednou za mnoho let na tom budem jako v Londýně.

PS: není to vůbec jednoduché...