class MyClass {
MyInterface myObj = new MyClassToBeTested();
public void abc(){
myObj.myMethodToBeVerified (new String(“a”), new String(“b”));
}
}
Ich versuche, JUnit für MyClass zu schreiben. Ich habe getan
class MyClassTest {
MyClass myClass = new MyClass();
@Mock
MyInterface myInterface;
testAbc(){
myClass.abc();
verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”));
}
}
Aber ich bekomme mockito gesucht, aber nicht aufgerufen. Tatsächlich gab es null Interaktionen mit diesem Mock beim Bestätigungsaufruf.
kann jemand einige Lösungen vorschlagen.
Jk1
Sie müssen Mock in die Klasse einfügen, die Sie testen. Im Moment interagierst du mit dem realen Objekt, nicht mit dem Scheinobjekt. Sie können den Code auf folgende Weise reparieren:
obwohl es klüger wäre, den gesamten Initialisierungscode in zu extrahieren @Before
@Before
void setUp(){
myClass = new myClass();
myClass.myObj = myInteface;
}
@Test
void testAbc(){
myClass.abc();
verify(myInterface).myMethodToBeVerified(new String("a"), new String("b"));
}
Warum können wir nicht verwenden Mockito.mock hier?
– IgorGanapolsky
23. Januar 2017 um 16:23 Uhr
@IgorGanapolsky: Wir können Mockito.mock verwenden, dafür müssen wir eine Setter-Methode für myObj verwenden und das verspottete Objekt auf myObj setzen.
– vijaya kumar
22. Februar 2017 um 21:27 Uhr
Deine Klasse MyClass schafft ein neues MyClassToBeTestedanstatt Ihren Schein zu verwenden. Mein Artikel im Mockito-Wiki beschreibt zwei Möglichkeiten, damit umzugehen.
HikariDataSourceProvider dataSourceProvider = mock(DataSourceProvider.class); verifizieren(dataSourceProvider).shutdown(); was ist daran problematisch
– Irfan Nassim
18. Juli 2018 um 9:43 Uhr
Kevin Welker
Die Antwort von @ Jk1 ist in Ordnung, aber Mockito ermöglicht auch eine prägnantere Injektion mithilfe von Anmerkungen:
@InjectMocks MyClass myClass; //@InjectMocks automatically instantiates too
@Mock MyInterface myInterface
Aber unabhängig davon, welche Methode Sie verwenden, werden die Anmerkungen nicht verarbeitet (nicht einmal Ihr @Mock), es sei denn, Sie rufen irgendwie die Statik auf MockitoAnnotation.initMocks() oder kommentieren Sie die Klasse mit @RunWith(MockitoJUnitRunner.class).
vijaya kumar
Die Antwort von @jk1 ist perfekt, da @igor Ganapolsky gefragt hat, warum können wir hier nicht Mockito.mock verwenden? Ich poste diese Antwort.
Dafür haben wir eine Setter-Methode für myobj bereitgestellt und den myobj-Wert mit einem verspotteten Objekt gesetzt.
class MyClass {
MyInterface myObj;
public void abc() {
myObj.myMethodToBeVerified (new String("a"), new String("b"));
}
public void setMyObj(MyInterface obj)
{
this.myObj=obj;
}
}
In unserer Testklasse müssen wir den folgenden Code schreiben
class MyClassTest {
MyClass myClass = new MyClass();
@Mock
MyInterface myInterface;
@test
testAbc() {
myclass.setMyObj(myInterface); //it is good to have in @before method
myClass.abc();
verify(myInterface).myMethodToBeVerified(new String("a"), new String("b"));
}
}
Diese Ausnahme kann auch ausgelöst werden, wenn Sie beispielsweise erwarten, dass thisMethod() ausgeführt wird, dies jedoch nicht der Fall ist. Das war nicht der Fall, weil es sich um eine Bedingung handelt, die nicht erfüllt wurde.
Wenn Sie beispielsweise einen Komponententest haben, der besagt, dass vergewissern Sie sich, dass thisMethod() ausgeführt wird, dies jedoch nicht der Fall war, da varX und varY nicht gleich sind.
//method expected to be called.
if( varX == varY){
thisMethod();
}
//test
Mockito.verify(foo).thisMethod();
13818500cookie-checkAusnahme: mockito wollte, aber nicht aufgerufen, tatsächlich gab es null Interaktionen mit diesem Mockyes