JMockit имитирует защищенный метод в суперклассе и все еще тестирует метод в реальном дочернем классе

Я все еще изучаю JMockit, и мне нужна помощь в его понимании.

Я тестирую класс, который использует методы суперкласса. Мой тест получает нулевой указатель, когда он пытается использовать метод суперкласса из-за кода внутри него, который использует контекст действия struts для получения сеанса и извлечения объекта из сеанса.

Метод, который я хочу обойти в рамках защищенного метода.

public class MyExtendingClass extends MySuperClass{ 
  public void methodIamTesting(){///} 
}

public abstract class MySuperClass{
  //I want to mock this method
  protected Object myProtectedSuperClassMethod(){
// struts action context code that returns an object//}
}

Тестовый код

@Test
public void testRunsAndDoesntPass() {
Mockit.setUpMock(MySuperClass.class, new MySuperClass(){       
  public Object myProtectedSuperClassMethod() {
      return object;
  }
}); 

// real class method invocation happens
assertEquals(expected, actual);

}

Я продолжаю получать NullPointers, как если бы у меня не было макета. Не знаю, что делать дальше. Все документы и образцы кода, которые я прочитал, говорят, что нужно просто объявить метод суперкласса общедоступным в setUpMock, и он должен работать.

Я не могу издеваться над всем классом, потому что это класс, который я тестирую.


person branchgabriel    schedule 25.07.2012    source источник


Ответы (2)


Я обнаружил, что мне нужно создать MockClass, а затем правильно ссылаться на него с помощью setupmock.

Я действительно влюбляюсь в JMockit.

@MockClass(realClass = MyExtendingClass.class)
public static class MockSuperClass {
  final Object object = new Object();

  @Mock
  public Object myProtectedSuperClassMethod() {
      return object;
 }}
@Test
public void testRunsAndNowWillPass() {

Mockit.setUpMock(MySuperClass.class, new MockSuperClass(){
public Object myProtectedSuperClassMethod() {
  return object;
}});
// real class method invocation happens where i set expected and actual
assertEquals(expected, actual);
}
person branchgabriel    schedule 25.07.2012
comment
это работает как чудо для меня! Спасибо огромное. JMockit такой мощный - person gigi2; 05.03.2014

вы полностью маскируете реализацию родительского класса @Mocked final MySuperClass base

abstract class MySuperClass{
    protected Object myProtectedSuperClassMethod(){
}

class MyExtendingClass extends MySuperClass{ 
    public void methodIamTesting(){///} 
}

@Test
public void testRunsAndDoesntPass(@Mocked final MySuperClass base ) {
    //you could mask out all the base class implementation like this
    new Expectations(){{
        invoke(base, "myProtectedSuperClassMethod");
    }};

    // real class method invocation happens
    // ...
    assertEquals(expected, actual);
}
person zinking    schedule 08.01.2015