Junit Mockito NullPointerException для Mock для автоматического подключения на основе конструктора

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

При написании тестовых примеров для класса реализации я получаю исключение NullPointerException, потому что объект, созданный в классе реализации имеет другую ссылку на объект, а фиктивный объект имеет другое ссылочное значение.

Может ли кто-нибудь рассказать мне, как издеваться над объектом.

Класс реализации

public class ImplementationClass implements ClientClass {

private final RepositoryInterface repositoryInterface;
@Autowired
public ImplementationClass( RepositoryInterface repositoryInterface ) {
    this.repositoryInterface = repositoryInterface;
}
@Autowired
AAA aaa;

@Autowired
BBB bbb;

@Autowired
CCC ccc;

public DomainClass getDetails( String Id ) {
    // aaa, bbb, ccc usage
    DomainClass getDetDocument =
        repositoryInterface.findById( Id ).orElse( null );

}

Класс модульного теста

@Mock
RepositoryInterface repositoryInterface;

@Mock
DomainClass DomainClass;

@Mock
AAA aaa;

@Mock
BBB bbb;

@Mock
CCC ccc;

@InjectMocks
ImplementationClass implementationClass;

@Before
public void setUp() {
    MockitoAnnotations.initMocks( this );
    }

 @Test
public void getDetTest() {
DomainClass dc = new DomainClass();
    dc.setId( "Id-123456789" );
    dc.setDetailsList( <Some list> );

    Optional<DomainClass> c1 = Optional.of( dc );
    // when().thenReturn(); // aaa, bbb, ccc usage
when( repositoryInterface.findById( "Id-123456789" )).thenReturn( c1 );
    DomainClass c2 = implementationClass.getDetails( "Id-123456789" );

    assertThat( c2.getDetailsList(), equalTo( c1.getDetailsList() ) );
}

ОБНОВЛЕНИЕ: при отладке класса Test объект репозиторийwhen( repositoryInterface.findById( "Id-123456789" )).thenReturn( c1 ); создает эталонное значение (23425634534 @ 2005) и когда Класс реализации называется репозиторийDomainClass getDetDocument =repositoryInterface.findById( Id ).orElse( null );. в классе реализации имеет справочное значение (23425634534 @ 1879). Из-за этого я получаю null для getDetDocument.

При запросе исключения всегда отправляет полную трассировку стека исключения.

JB Nizet 20.11.2018 07:57

Это пользовательское исключение, которое я получаю в консоли. Но во время отладки я получаю значение null для оператора DomainClass getDetDocument = repositoryInterface.findById( Id ).orElse( null ); в классе реализации. Это потому, что значение ссылки на объект repositoryInterface отличается в классе реализации и в классе тестирования.

Sam 21.11.2018 06:14
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
1 661
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После всех исследований он заработал, изменив способ создания объекта конструктором.

// @Mock //removed this annotation
   RepositoryInterface repositoryInterface;


@Before
   public void setUp() {
     repositoryInterface = mock(RepositoryInterface.class)
     ImplementationClass = new ImplementationClass(repositoryInterface);
     MockitoAnnotations.initMocks( this );
}

Ссылка: https://mhaligowski.github.io/blog/2014/05/30/mockito-with-both-constructor-and-field-injection.html

Другие вопросы по теме

Почему эта ошибка, показывающая «MessageContext не может быть разрешена для типа» при весенней загрузке?
Какая библиотека / модуль лучше всего и должен ли я использовать для загрузки нескольких файлов из формы, если я использую реакцию во внешнем интерфейсе и загрузку Spring в бэкенде?
Проблема с политикой CORS при использовании остальной службы (Spring Boot) из приложения Angular5
Получение java.sql.SQLRecoverableException: закрытое соединение в приложении весенней загрузки
Сервер отправил события с помощью sseemitter, и на ответ требуется больше времени
Регистрация микросервисов без пользовательского интерфейса Jhipster с доступом к шлюзу
AWS EC2 - не удается запустить веб-сервис весенней загрузки извне, но работает нормально на локальном хосте
Как узнать, сколько подключений подключается к сайту SpringBoot?
Ошибка при попытке отправить в конечную точку отдыха. Spring Boot / JPA
Не удалось обновить с помощью DataJpaTest Spring Boot 2.1.0