Jak volání metody metoda posmívali třídy?

0

Otázka

Jak volání metody metoda posmívali třídy?

when(mockedClass.method1().method2()).thenReturn(x);

Tento řádek kódu je házení

org.mockito.exceptions.misusing.MissingMethodInvocationException

Nejsem schopen volání 2. metoda po zesměšňovat třídy. Snažil jsem se doReturn, spy, ale nevyšlo to.

Nějaké řešení se cení!

java junit5 mockito spring-boot
2021-11-22 06:28:35
1

Nejlepší odpověď

1

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);
2021-11-22 07:15:42

Můžete odkazovat na kód zde: stackoverflow.com/questions/69999768/...
Tanaya Mitra

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................