Метод тестирования, который вызывает защищенный метод, образует другой класс - PullRequest
0 голосов
/ 14 декабря 2018
class A {
    protected obj init()
}

class B {
    public void testingThis() {
      //..stuff
      obj = a.init()
      moreStuff(obj)
    }
}

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

PS не может изменить видимость, не может положить в ту же упаковку.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

B не правильно написано на мой взгляд.Ссылка на A должна была быть введенной зависимостью.Теперь у вас есть 2 способа проверить это: чистый способ или способ PowerMock.Если вы сделаете чистый путь, то вы проведете рефакторинг B, чтобы в него была введена зависимость A, и поэтому вы можете управлять классом A с помощью макета.

class B {
    A myAclass;

    @Inject
    public B(A myAclass) {
        this.myAclass=myAclass;
    }

    public void testingThis() {
      //..stuff
      obj = myAclass.init()
      moreStuff(obj)
    }
}

Теперь тест может выглядеть примерно так:

@RunWith(MockitoJUnitRunner.class)
public class Btest {
    @Mock
    A myAmock; 

    @InjectMocks
    B sut; // System-Under-Test

    @Test
    public void testB() {
        X theObject = mock(X.class);
        when(myAmock.init()).thenReturn(theObject);

        // call the method
        sut.testingThis();

        //verify the call being done
        verify(a, times(1)).init();
    }
}

Если вы не можете изменить код B, вы все равно можете проверить его, но для этого вам нужен PowerMock (ito).

@RunWith(PowerMockRunner.class)
@PrepareForTests({A.class, B.class})
public class Btest {
    B sut;

    @Test
    public void testB() {
       A aMock = mock(A.class);
       X thObject = mock(X.class);

       // I can't determine from the code if the init method is static or you use an instance. In case of an instance you must override the constructor:
       PowerMockito.mockStatic(A.class);
       PowerMockito.whenNew(A.class).withNoArguments().thenReturn(aMock);
       when(aMock.init()).thenReturn(theObject);

       // In case of a static method you should mock that method
       when(A.init()).thenReturn(theObject);

       // Now construct B to test it.
       sut = new B();
       sut.testingThis();

       // verify
       verify(aMock, times(1)).init();
    }
}
0 голосов
/ 14 декабря 2018

С такими ограничениями «простейший» объявляет класс в классе тестирования или его пакете, который подклассы A - это зависимость, которую вы хотите смоделировать.
Stub init() для возврата данных фиксатора иэто должно быть хорошо.
Вы можете передать его в конструктор класса заглушки.

Это даст класс заглушки, который вы можете использовать в качестве зависимости в своем тестовом классе:

class StubA extends A {

    Foo stubbedFoo;
    public StubA(Foo stubbedFoo){this.stubbedFoo=stubbedFoo}

    @Override
    public Foo init(){
       return stubbedFoo;
   }
}

Тестовый образец:

class BTest {

    @Test
    public void doThat() {
      StubA a = new StubA(anyFooValue);
      B b = new B(a);
      // action
      b.doThat();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...