Метод класса InjectMocks возвращает Null - PullRequest
0 голосов
/ 30 января 2019

При запуске тестового примера JUnit с Mockito я получаю нулевое значение, возвращаемое из-под метода manager.managerLogString (метод @InjectMocks класса ArticleManager).

TestingString = manager.managerLogString();

В то же время я могу получить правильное значение "UserInput" для метода проверки ниже mockito.

verify(user).setMyuserString("UserInput");

Полный код, как показано ниже, оцените, если вымог бы дать совет.

package com;

public class User {
  private String userString;

  public User() {}

  public void setMyuserString(String userString) {
     this.userString = userString;
  }

  public String logMyUserString() {
      return this.userString;
  }
}

Диспетчер статей:

package com;

import javax.inject.Inject;

public class ArticleManager{

  @Inject
  private User user;

  public String managerLogString() {
      return this.user.logMyUserString();
  }
}

Тесты:

package com;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.Captor;
import org.mockito.InjectMocks;  
import org.mockito.Mock;


@RunWith(MockitoJUnitRunner.class)
public class MockExample {
@Mock User user;
@InjectMocks private ArticleManager manager; 
private String TestingString;

@Test
public void test() {
    user.setMyuserString("UserInput");
            // verify this mock class return correct value
    verify(user).setMyuserString("UserInput");

            // why this manager.managerLogString return null value ??
    TestingString = manager.managerLogString();
    System.out.println(TestingString);

    assertEquals("UserInput", TestingString);
}
}

По совету здесь код работает нормально.Обновленный код, как показано ниже.

Обновленный код:

@Test
public void test() {
    when(user.logMyUserString()).thenReturn("UserInput");

    TestingString = manager.managerLogString();
    verify(user).logMyUserString();

    System.out.println(TestingString);

    assertEquals("UserInput", TestingString);
}

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Вы не создали экземпляр ArticleManager

, попробуйте этот способ

@RunWith(MockitoJUnitRunner.class)
public class MockExample {
@Mock User user;
@InjectMocks private ArticleManager manager = new ArticleManager(); 
private String TestingString;
0 голосов
/ 30 января 2019

Здесь:

@Mock
User user;

Тогда вы идете:

user.setMyuserString("UserInput");
// verify this mock class return correct value
verify(user).setMyuserString("UserInput");

И это просто не имеет никакого смысла.Вы издеваетесь этот класс.Это означает, что вы создаете объект, который говорит: «Я - пользователь», но на самом деле это не так.Другими словами: единственное, что вы хотите / должны сделать, - это сказать вашей модели, чтобы она возвращала ожидаемое значение, когда вызывается его logMyUserString()!

Как в:

when(user.logMyUserString()).thenReturn("User Input");

итеперь, когда вы правильно используете @InjectMocks, вызовите logMyUserString() и mock вернет строку, которую вы сказали вернуть.Но вы хотите видеть здесь , чтобы понять, как легко инъекция может пойти не так.

Нет смысла использовать метод сеттера, потому что этот сеттер "искусственный", он ничего не устанавливает!

Кроме этого: почему у вас есть аннотация @Inject в вашем производствекодовые классы?Если вы думаете, что они вам нужны для mockito, нет, нет, не надо.

Наконец: я думаю, вам стоит вернуться и посмотреть хороший учебник по Mockito .Ваша настоящая проблема в том, что вам не хватает понимания того, что вы делаете.

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