Junit Mockito NullPointerException для Mock для конструктора на основе автопроводки - PullRequest
0 голосов
/ 20 ноября 2018

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

При написании тестовых примеров для класса реализации я получаю исключение 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 объект repositoryInterface when( repositoryInterface.findById( "Id-123456789" )).thenReturn( c1 ); создает ссылочное значение (23425634534 @ 2005) и когда Класс реализации называется repositoryInterface DomainClass getDetDocument =repositoryInterface.findById( Id ).orElse( null ); в ВнедрениеКласс имеет ссылочное значение (23425634534 @ 1879). Из-за этого я получаю null для getDetDocument.

1 Ответ

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

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

// @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

...