InjectMock с ненулевым издевательским объектом? - PullRequest
0 голосов
/ 17 июня 2020

Я выполняю InjectMocks и получаю следующую ошибку: «java .lang.NullPointerException: ... помечено как ненулевое, но имеет значение null», что связано с проверкой ненулевого значения, которая у меня есть. Я хочу сформировать InjectMock, но этот объект injectmock построен с использованием параметров.

Вот какой-то псевдокод:

@ExtendWith(MockitoExtension.class)

public class Tester {
    @Spy private ClassA clA;
    @InjectMocks 
    private ClassB clB = new clB(clA);


    @BeforeEach
    void setup() throws Exception {
        Mock.when(clA.mymethod(Mockito.any())).thenReturn(Non_Null_Stuff);
    }

}

Я уверен, что вы видите, что я пытаюсь сделать здесь: создать класс B, используя имитируемую версию класса A, но это не работает, потому что это дает мне «clA отмечен ненулевым, но имеет значение NULL» в строке @InjectMocks. Это связано с тем, что код для создания clB требует ненулевого clA.

Кажется, что я не могу разместить строку InjectMocks в функции настройки, и я не могу разместить Mock.when перед InjectMocks, поэтому я застрял. Любой совет приветствуется

1 Ответ

1 голос
/ 17 июня 2020

Пара вопросов. Ответ зависит от того, чего вы хотите достичь.

Чтобы использовать аннотации Mockito, вы должны добавить следующую строку над своим классом (в случае, если вы используете jUnit 5):

@ExtendWith(MockitoExtension.class)

И, эта зависимость от вашего pom (если вы используете Maven (вы можете найти аналог Gradle здесь: https://mvnrepository.com/artifact/org.mockito/mockito-junit-jupiter/3.3.3))

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>3.3.3</version>
    <scope>test</scope>
</dependency>

@ Spy

означает, что вы будете использовать реальный объект (а не макет), и он в основном используется для проверки этого объекта (проверьте, вызывались ли определенные методы соответствующее количество раз с соответствующими аргументами. , см .: https://www.baeldung.com/mockito-verify).

@ Mock

означает, что вы будете использовать mocked объект, а вы должен установить его поведение с помощью Mockito. when ()

@ Mock используется для исключения logi c из тестирования и заставляет методы объектов вести себя так, как вам нужно для конкретного модульного теста.

Надеюсь, этот фрагмент кода поможет вам понять разницу:

* 10 36 *

Класс A:

public class ClassA {

    public String realMethod() {
        return "ClassA";
    }
}

Класс B:

public class ClassB {

    public String mockedMethod(){
        return "ClassB";  // we will not be using it's real behaviour
    }
}

Класс C:

public class ClassC {

    private ClassA classA;

    private ClassB classB;

    public ClassC(ClassA classA, ClassB classB) {
        this.classA = classA;
        this.classB = classB;
    }

    public String someMethod() {
        return classA.realMethod() + " - " +classB.mockedMethod();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...