NullPointerException PowerMock для класса с использованием служебных методов и методов экземпляра - PullRequest
0 голосов
/ 08 октября 2019
gradleVersion = '4.1'
"org.powermock:powermock-api-mockito:1.6.3"
testCompile("org.powermock:powermock-module-junit4:1.6.3")
Jacoco default version used by Gradle 4.1

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

Тестируемый класс:

public class StaticandInstance {
    public int age;
    public String name;
public static String commonPrefix(int age){
    if(age <18)
        return "Junior";
    if(age > 18 && age< 65)
        return "Mr/Miss/Mrs";
    if(age>=65)
        return "Senior";

    return "Sir/Madam";             
}
public StaticandInstance(int age,String name){
    this.age=age;
    this.name=name;
    }
public String callPerson(){
   return commonPrefix(age)+" " + name; 
    }
}

Тестовый класс равен


    import static org.junit.Assert.*;

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.powermock.api.mockito.PowerMockito;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;

    @RunWith(PowerMockRunner.class)
    @PrepareForTest({StaticandInstance.class})
    public class StaticandInstanceTest {
        StaticandInstance instance;
        @Test
        public void testStaticAndInstance() {
            PowerMockito.mockStatic(StaticandInstance.class);
            instance= new StaticandInstance(15,"Vikram");
            String test = instance.callPerson();
            assertEquals(test, "Junior Vikram");
        }

    }

Когда я выполняю это как JUnit Itработает успешно, но не удалось запустить с Gradle и показывает покрытие кода Jacoco как ноль.

Сообщение об ошибке:

java.lang.NullPointerException
    at StaticandInstance.<init>(StaticandInstance.java:19)
    at testStaticAndInstance(StaticandInstanceTest.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

1 Ответ

0 голосов
/ 08 октября 2019

Предполагая, что ваш файл Gradle в порядке, и для данного примера вы предоставляете. Я думаю, что вы забыли указать, что должно происходить, когда статический метод commonPrefix вызывается с параметром 15.

. Проверьте следующий код и комментарии в коде:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.junit.Assert.assertEquals;

@RunWith(PowerMockRunner.class)
@PrepareForTest({StaticandInstance.class})
public class StaticandInstanceTest {
    StaticandInstance instance;

    @Test
    public void testStaticAndInstance() {
        PowerMockito.mockStatic(StaticandInstance.class);
        instance = new StaticandInstance(15, "Vikram");
        // You have to specify what happen when the static method you are trying to mock is called.
        Mockito.when(StaticandInstance.commonPrefix(15)).thenReturn("Junior");
        // Then you can do your actual method call
        String test = instance.callPerson();
        // And assert
        assertEquals(test, "Junior Vikram");
    }

}

Но для конкретного случая, который вы предоставляете, вероятно, нет необходимости в PowerMockito и статическом макете вообще.

import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class StaticandInstanceTest {
    StaticandInstance instance;

    @Test
    public void testMethod() {
        instance = new StaticandInstance(15, "Vikram");
        // Then you can do your actual method call
        String test = instance.callPerson();
        // And assert
        assertEquals(test, "Junior Vikram");
    }

}
...