Мокито и частное поле / фасоль - PullRequest
0 голосов
/ 21 ноября 2018

Каков стандартный способ доступа / установки частного поля в Java-EE-Bean для тестирования Mockito?Тест выглядит следующим образом, но поле MyDao, конечно, будет нулевым, если я запустил (Mockito-) тест.NullPointerException выбрасывается для MyDao.

Но я не хочу использовать Reflection - есть ли другой способ сделать это или архитектура сервиса плохая?

Класс для тестирования:

@Stateless
public class MyServiceImpl extends AbstractService {

@Inject
private MyDao myDao;

public MyEntity findByIdOrThrow( final long id ) throws Exception {
        if ( id > 0 ) {
            final MyEntity entity = myDao.findById( id );
            if ( entity == null ) {
                throw new Exception(  );
            } else {
                return entity;
            }
        } else {
            throw new Exception(  );
        }
    }

Тестовый класс:

public class MyServiceImplTest {
private MyServiceImpl myServiceImpl;

@BeforeEach
public void setup() {
    myServiceImpl = new ServiceServiceImpl();
}

@Test
public void findByIdOrThrow() throws Exception {
    Long id = 1L;
    when( myServiceImpl.findByIdOrThrow( id ) ).thenReturn( new MyEntity() );        
}}

Обновлен тестовый класс:

import static org.mockito.Mockito.when;

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.junit.MockitoJUnitRunner;

import de.myapp.dao.MyDao;
import de.myapp.entity.MyEntity;

@RunWith( MockitoJUnitRunner.class )
public class ServiceServiceImplTest {

    @Mock
    public MyDao myDao;

    @InjectMocks
    public MyServiceImpl myServiceImpl;

    @Test
    public void findByIdOrThrow() throws Exception {
        final Long id = 1L;
        when( myServiceImpl.findByIdOrThrow( id ) ).thenReturn( new MyEntity() );
    }

}

1 Ответ

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

Я предполагаю, что MyDao - это интерфейс.В вашем тестовом классе вы должны сделать следующее:

@Mock
private MyDao myDao;

@InjectMocks
private MyServiceImpl myServiceImpl;

и удалить метод @BeforeEach.Таким образом, вы введете макет своего дао в классе.Используя Mockito.when, вы правильно настроите дао-макет, чтобы имитировать ваш настоящий дао.Не забудьте изменить объявление теста следующим образом:

@RunWith(MockitoJUnitRunner.class)
public class MyServiceImplTest

Если вы используете JUnit 5, объявление класса тестирования должно быть следующим:

@ExtendWith(MockitoExtension.class)
@RunWith(JUnitPlatform.class)

В этом последнем случае, вероятно,Вы можете опустить @RunWith, но я не уверен.

...