method2()
nepatří k typu posmívali. To patří k typu, který je vrácen method1()
. Můžete jen říct, mock, co se vrátíte na volání do method1()
(to je důvod, pro misusing
součástí výjimky název balíčku).
Teoreticky, můžete vytvořit mock pro typ vrácené method1()
a poučit mockedClass
vrátit to druhé zesměšňovat a pak řekni nový mock vrátit x
když method2()
se nazývá. Ale nechat se vysmívá vrátit jiných zesměšňuje je obvykle špatný nápad z mnoha důvodů.
Bez znalosti vaší aktuální kód, a to, co opravdu chcete dosáhnout, je opravdu těžké dát nějakou radu na toto téma. Proto mohu nabídnout jen některé obecné tipy, které mohou nebo nemusí vztahovat na vás situaci.
Obvykle, object1.method1().method2()
volání řetězce je třeba se vyhnout. "Řekni, neptej se" princip říká, že žádat objekt pro něco a pak působí na to, že něco je třeba se vyhnout (Řekni objektu co dělat, místo toho se ptát, je to za věci a dělat to sami). Volání řetězce znamená, že method1()
je vracet jiný objekt (object2
), který je pak použit k volání method2()
. Místo toho, měli byste přidat metodu object1
což dělá volání method2()
a vrací jeho výsledek. Jednoduchý příklad:
To je to, co jste tříd může vypadat jako
public class C1 {
private C2 o2;
public C2 method1() {
return o2;
}
}
public class C2 {
public int method2() {
return computeValue();
}
}
// somewhere else:
int value = object1.method1().method2();
Místo toho, můžete navrhnout to takhle:
public class C1 {
private C2 o2;
//public C2 method1() {
// return o2;
//}
public int method3() {
return o2.method2();
}
}
public class C2 {
public int method2() {
return computeValue();
}
}
// somewhere else:
//int value = object1.method1().method2();
int value = object1.method3();
Tímto způsobem se vyhnete volání řetězce a C1
nemusí odhalit, že obsahuje hodnotu typu C2
což znamená, že byste mohli změnit bez volající byli vědomi.
Kromě lepšího designu a zamezení volání řetězce (také volal "troska"), to vám umožní provést následující kroky pro vaši zesměšňovat situaci:
//when(mockedClass.method1().method2()).thenReturn(x);
when(mockedClass.method3()).thenReturn(x);