2016-07-21 25 views
0

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.

+1

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. –

+0

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

Antwort

0

Sie haben zwei Möglichkeiten, ein Mock-Objekt in das Objekt unter dem Test zu injizieren.

manuell über WhiteBox

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MainClass.class) 
public class WhiteBoxApproachTestClass { 

    @Before 
    public void setUp() throws Exception { 
    suppress(constructor(BaseClass.class)); 
    } 


    @Test 
    public void testMyMethod() { 
    MainClass main = new MainClass(createMock(ConfigClass.class)); 

    List<String> list1 = new ArrayList<>(); 
    list1.add("somevalues"); 

    Class1inSuperClass ob1 = createMock(Class1inSuperClass.class); 
    Class2inSuperClass ob2 = createMock(Class2inSuperClass.class); 

    expect(ob2.method()).andReturn(getClass()); 
    expect(ob1.operation(getClass())).andReturn(list1); 

    Whitebox.setInternalState(main, "objectOfClass1inSuperClass", ob1); 
    Whitebox.setInternalState(main, "objectOfClass2inSuperClass", ob2); 

    replayAll(); 

    main.myMethod(); 

    assertThat(MainClass.variableToBeAsserted).isEqualTo(5); 
    } 
} 

Und über @TestSubject (http://easymock.org/user-guide.html#mocking-annotations)

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MainClass.class) 
public class TestSubjectApproachTestClass { 

    @Mock(fieldName = "objectOfClass1inSuperClass") 
    private Class1inSuperClass ob1; 

    @Mock(fieldName = "objectOfClass2inSuperClass") 
    private Class2inSuperClass ob2; 

    @TestSubject 
    private final MainClass main = new MainClass(createMock(ConfigClass.class)); 

    @BeforeClass 
    public static void before() throws Exception { 
    suppress(constructor(BaseClass.class)); 
    } 

    @Test 
    public void testMyMethod() { 

    List<String> list1= new ArrayList<>(); 
    list1.add("somevalues"); 

    expect(ob2.method()).andReturn(getClass()); 
    expect(ob1.operation(getClass())).andReturn(list1); 

    EasyMockSupport.injectMocks(main); 

    replayAll(); 

    main.myMethod(); 

    assertThat(MainClass.variableToBeAsserted).isEqualTo(5); 
    } 
} 

Voll Code, den Sie here finden.