Ich habe eine Klasse getestet werden, die wie folgt lautet:Mock-Objekt der Superklasse in der Unterklasse mit EasyMock
public class MainClass extends BaseClass {
public static int variableToBeAsserted= 0;
MainClass(ConfigClass config) {
super(config);
}
public void myMethod() {
List list = objectOfClass1inSuperClass.operation(objectOfClass2inSuperClass.method())
while(methodInSuperClass()) {
// doing operations with 'list'
variableToBeAsserted++;
}
}
// ..few other methods which I am not going to test.
}
ich den Konstruktor meines BaseClass
und meine ConfigClass
unterdrückt haben. Jetzt ist mein Test-Klasse wie folgt aus:
@RunWith(PowerMockRunner.class)
@PrepareForTest(MainClass.class)
public class TestClass {
@Before
public void setUp(){
suppress(constructor(BaseClass.class))
suppress(constructor(ConfigClass.class))
}
@Test
public void testMyMethod(){
MainClass main = new MainClass(new ConfigClass(""));
List list1= new ArrayList();
test1.add("somevalues");
Class1inSuperClass ob1 = PowerMock.createMock(Class1inSuperClass.class);
Class2inSuperClass ob2 = PowerMock.createMock(Class2inSuperClass.class);
EasyMock.expect(ob2.method()).andReturn(getClass());
EasyMock.expect(ob1.operation(getClass())).andReturn(list1);
PowerMock.replayAll();
main.myMethod();
Assert.assertEquals(expectedValue, main.variableToBeAsserted);
}
}
Nun weiß ich nicht, warum, aber mein Testfall nicht mit einem NullPointerException
.
Es versucht auf objectofClass1inSuperClass
zuzugreifen und schlägt fehl. Ich dachte, das wird es verspotten. Aber es wird nicht verspottet.
EDIT: Ich schreibe nur den Test und ich kann nichts in BaseClass
ändern. Ich habe jedoch die Möglichkeit, die MainClass
zu ändern.
Bitte korrigieren Sie mich, wenn ich falsch liege. So verstehe ich Ihren Fall: Im Konstruktor der BaseClass werden die Felder 'objectOfClass1inSuperClass' und' objectOfClass2inSuperClass' initialisiert. Sie unterdrücken den Konstruktor 'BaseClass', um ein solches Verhalten zu vermeiden. Aber warum unterdrücken Sie 'ConfigClass'constructor? Auch ich sehe, dass Sie Mocks erstellen, aber injizieren/setzen Sie es nie. –
Sogar der Konstruktor 'configClass' initialisiert einige Klassen, die ich nicht verwenden möchte. Daher unterdrücke ich es. Ja, das ist was ich wissen will. Wie man die Mocks in mein eigentliches Objekt injiziert – v1shnu