2013-10-27 3 views
3

Я новичок в Mockito и PowerMock, и у меня действительно проблемы с получением этого. Это в значительной степени ситуация у меня есть:Как издеваться и тестировать этот внутренний статический класс

class A { 

    static class B { 

    public class B(Object1 o1, Object2 o2) { 
     setInSuperClass(o1); // this is private method... 
     doSomethingWithInnerClass (new Object3() { 

      @Override 
      public void retreat() { 
       someVar = new Object5(o2); // someVar is from superclass and is private, I know I can get it with PowerMock 
      } 

      @Override 
      public boolean doSomething(){ 
       return true; 
      } 

     }) 

    } 
    } 
} 

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

@Mock 
    Object1 o1; 

    @Mock 
    Object2 o2; 

    public void test() { 
     B b = new B(o1, o2); 
     PowerMockito.verifyPrivate(b).invoke("setInSuperClass", 1 , o1); 
    } 

но как наилучшим образом проверить doSomethingWithInnerClass ??? Я имею в виду, я знаю, что могу проверить, что он был вызван .... но этот аргумент анонимного класса, который я хотел бы протестировать. Я ценю советы, Thanx

+0

Код вашего класса не компилируется. –

+0

@JBNizet, теперь у меня нет доступа к коду, да, возможно, есть некоторые типографии, но это общее описание проблемы. – Julia

+0

Поскольку вы владелец класса I переместили статический внутренний в другой класс в подпакет. Кроме того, я не вижу значения для проверки того, что был вызван частный метод. –

ответ

1

Я считаю, что вам нужно перенаправить свое мышление. Например, вместо проверки того, что setInSuperClass вызывается с использованием Powermock, вы должны проверить результат вызова. Есть ли заданное поле? Есть ли геттер на этом поле? Есть ли другое поведение, которое управляется этим полем, которое можно проверить?

То же самое относится к doSomethingWithInnerClass. Вызов метода, который не делает ничего, может быть и не там. Должен быть результат вызова. Либо какой-то вывод, либо вызов другого метода/класса или побочного эффекта. Проверьте результат.

Если это действительно невозможно, вам может потребоваться создать подкласс внутреннего класса для тестирования. Этот подкласс будет отменять метод, вызываемый тестируемым методом.

0

Вам не следует проверять, что приватная переменная устанавливается. Вы должны проверить, какой эффект оказывает на последующее поведение объекта. Поэтому сделайте то, что вам нужно сделать, чтобы запустить ваш метод retreat, но затем вызовите другой метод на охватывающем объекте, который использует значение этой частной переменной.

Если нет способа указать из окружающего объекта, что переменная установлена, то это говорит о том, что сама переменная на самом деле не нужна.

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