2016-07-21 1 views
0

У меня есть класс для тестирования, который выглядит так:Mock объект суперкласса в подклассе, используя 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. 
} 

Я подавил конструктор моего BaseClass и мой ConfigClass. Теперь мой тестовый класс, как это:

@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);  
    } 
} 

Теперь я не знаю, почему, но мой тест завершается с NullPointerException.

Он пытается получить доступ к objectofClass1inSuperClass и не удается. Я думал, что это будет издеваться над этим. Но это не издевается.

EDIT: Я пишу только тест, и ничего не могу изменить в BaseClass. Однако у меня есть возможность изменить MainClass.

+1

Пожалуйста, исправьте меня, если я ошибаюсь. Вот как я понимаю ваш случай: в конструкторе «BaseClass» поля «objectOfClass1inSuperClass» и 'objectOfClass2inSuperClass' инициализируются. Вы запрещаете конструктор 'BaseClass', чтобы избежать такого поведения. Но почему вы подавляете конструктор ConfigClass? Также я вижу, что вы создаете mocks, но никогда не добавляете/не устанавливаете его. –

+0

Даже конструктор 'configClass' инициализирует некоторые классы, которые я не хочу использовать. Поэтому я подавляю это. Да, это то, что я хочу знать. Как вводить насмешки в мой фактический объект – v1shnu

ответ

0

У вас есть два способа ввести объект-объект в объект под тестом.

вручную с помощью 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); 
    } 
} 

И через @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); 
    } 
} 

Полный код вы можете найти here.

 Смежные вопросы

  • Нет связанных вопросов^_^