Модульное тестирование для проверки метода сопутствующего объекта (насмешка над сопутствующим объектом) - PullRequest
0 голосов
/ 06 ноября 2018

При переключении на Kotlin статические методы перемещаются в сопутствующий объект. Однако не существует очевидного способа для модульного тестирования других методов, которые вызывают эти «статические методы».

В Java мы могли бы использовать MockStatic PowerMockito (SomeClass.class), чтобы убедиться, что статический метод вызывается в тестируемом методе. PowerMock теряет свою магию в Котлине.

Для тестирования я создал следующие классы.

public class DummyJava {
    static public Void staticMechod(){
          System.out.print("Dummy method is called");
          return null;
     }
}

class DummyCompanion {
    companion object {
        fun someCompanionMethod(){
            System.out.printf("companion method is called\n")
        }
    }
}

Теперь есть еще один класс, который вызывает DummyCompanion.someCompanion

public class DummyWrapper {
    public void callAStaticMethod(){
        Dummy.staticMechod();
    }

    public void callCompanionMethod(){
        DummyCompanion.Companion.someCompanionMethod();
    }
}

Для юнит-теста callAStaticMethod() Мы использовали следующее

@RunWith(PowerMockRunner.class)
@PrepareForTest({Dummy.class, DummyCompanion.Companion.class})
public class staticClassTest {
    //This case works
    @Test 
    public void testForStaticMethod() {
        PowerMockito.mockStatic(Dummy.class);   
        DummyWrapper testObject = new DummyWrapper();

        Mockito.when(Dummy.staticMechod()).thenCallRealMethod();

        testObject.callAStaticMethod();

        PowerMockito.verifyStatic(Dummy.class);
        Dummy.staticMechod();
    }

    //This case doesn't work. It always passes.
    @Test
    public void testForCompanionMethod() {
        PowerMockito.mockStatic(DummyCompanion.Companion.class);
        DummyWrapper testObject = new DummyWrapper();
        testObject.callCompanionMethod();
PowerMockito.verifyStatic(DummyCompanion.Companion.class,Mockito.times(1));
        DummyCompanion.Companion.someCompanionMethod();
}

У меня вопрос, как проверить, вызван ли сопутствующий метод.

Ответы [ 2 ]

0 голосов

Вы можете сделать это и с PowerMock, это будет выглядеть так:

@RunWith(PowerMockRunner.class)
@PrepareForTest({DummyCompanion.class})
public class staticClassTest {

    @Test
    public void testForCompanionMethod() {
       PowerMockito.mockStatic(DummyCompanion.class);
       DummyCompanion.Companion companionMock = PowerMockito.mock(DummyCompanion.Companion.class);
       Whitebox.setInternalState(
        DummyCompanion.class, "Companion",
        companionMock
       );

       DummyWrapper testObject = new DummyWrapper();
       testObject.callCompanionMethod();
       Mockito.verify(companionMock,Mockito.times(1)).someCompanionMethod();
    }
}

Kotlin создает для Java (в классе Kotlin, который в данном случае DummyCompanion) статическое поле своего подкласса Companion с именем Companion, которое можно установить с помощью инструмента PowerMock WhiteBox.setInternalState для смоделированного экземпляра Companion что позже вы сможете проверить вызов метода.

0 голосов
/ 06 ноября 2018

Решение 1: добавить функцию вызывающего в вызывающий класс

public class DummyWrapper {
val foo get() = DummyCompanion.Companion

public void callAStaticMethod(){
    foo.staticMechod();
}

public void callCompanionMethod(){
    foo.someCompanionMethod();
}
}

В тестовом классе мы можем использовать Mockito, чтобы предоставить заглушку для функции get() и убедиться, что она вызывается.

@Test
fun testCase{
....
val mockCompanionObj: DummyCompanion.Companion = mock()
val wrapper = DummyWrapper()

whenever(wrapper.foo).thenReturn(mockCompanionObj)
wrapper.callCompanionMethod()
verify(mockCompanionObj).someCompanionMethod()
....
}

Решение 2: использование Mockk Дразнить сопутствующий объект в Mockk легко. Нет необходимости вставлять тестовый интерфейс в исходный код.

 @Test
 fun testCompanionObject() {
    //Mock the companion object
    mockkObject(DummyCompanion.Companion)

    //define the stubbing bechavior of a companion object method
    every { DummyCompanion.Companion.companionMethod() } answers { stubMethod() }

    val testObject = DummyWrapper()

    //Call a method that calls the companion object method
    //You can verify stubMethod() is called
    testObject.callCompanionMethod()

    verify(exactly = 1) { DummyCompanion.someCompanionMethod() }
}

Подробнее см. Mockk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...