Тестирование с Junit 5 не удалось при загрузке Spring - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть класс обслуживания, как показано ниже.

public class DependantServiceImpl implements DependantService {

private DependantRepository dependantRepository;
private EmployeeRepository employeeRepository;

private final CompanyEntity companyEntity;

private final String DEPENDANT_ROLE = "dependant";

@Autowired
public DependantServiceImpl(
        CompanyEntity companyEntity, DependantRepository dependantRepository,
        EmployeeRepository employeeRepository) {

    this.companyEntity = companyEntity;
    this.dependantRepository = dependantRepository;
    this.employeeRepository = employeeRepository;
}

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

@Service
public class DependantServiceFactoryImpl implements DependantServiceFactory {

    private final DependantRepository dependantRepository;
    private final EmployeeRepository employeeRepository;
    private final CompanyRepository companyRepository;

    @Autowired
    public DependantServiceFactoryImpl(
            CompanyRepository companyRepository, DependantRepository dependantRepository,
            EmployeeRepository employeeRepository) {

        this.dependantRepository = dependantRepository;
        this.employeeRepository = employeeRepository;
        this.companyRepository = companyRepository;
    }

    @Override
    public DependantService dependantServiceForCompany(String companyId) {

        return companyRepository.findById(companyId)
                .map(companyEntity -> new DependantServiceImpl(
                        companyEntity, dependantRepository, employeeRepository))
                .orElseThrow(() ->
                        new IllegalArgumentException(String.format("Invalid Compnay Id [{%s}]", companyId)));

    }
}

Я хочу написать модульные тесты для класса Service ( DependantServiceImpl ), но для этого мне нужно получить класс обслуживания через DependantServiceFactoryImpl CRUD Repository (поскольку все репозитории расширены из Hibernate CRUD хранилище.) Внедрение в конструктор. Но проблема в том, что я не могу внедрить репозитории в DependantServiceFactoryImpl. Я пробовал много способов, как показано ниже.

@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = DependantServiceFactoryImpl.class)
public class DependantServiceImplTest {

    @MockBean
    DependantRepository dependantRepository;
    @MockBean
    EmployeeRepository employeeRepository;
    @MockBean
    CompanyRepository companyRepository;

    @Autowired
    DependantServiceFactory dependantServiceFactory;

    @Test
    @DisplayName("Get dependant succesfully test")
    void getDependentsTest() {

        String companyId = "1";
        String employeeId = "9a76bb33-772c-4c41-b2eb-eb40500d7026";


        List<DependantEntity> dependantEntityList = dependantServiceFactory
                .dependantServiceForCompany(companyId)
                .getDependents(employeeId);

        assertTrue(dependantEntityList.size() > 0);
    }

Но я получаю ошибку ниже (для полной ошибки проверьте ссылку https://gist.github.com/Menuka5/de6cd71b6e39e0895cf9be4e7ba34b3d)

java.lang.IllegalArgumentException: неверный идентификатор Compnay [{1}]

Может кто-нибудь указать способ создания рабочих юнит-тестов, пожалуйста. Заранее спасибо. :)

1 Ответ

0 голосов
/ 10 сентября 2018

Здесь есть 3 большие ошибки:

  1. Это должен быть модульный тест DependantServiceImpl, так что нет, вам не нужно звонить на завод, чтобы получить экземпляр сервиса.Вам также не нужны SpringExtension, MockBean и Autowired.Вам просто нужно вызвать конструктор DependantServiceImpl, передающий реальную сущность, и смоделировать экземпляры (созданные с помощью Mockito) репозиториев.
  2. Вы аннотировали конструктор DependantServiceImpl с помощью Autowired, но это не имеет смысла,поскольку DependantServiceImpl не является bean-компонентом Spring, не создается Spring и не может быть введен с помощью CompanyEntity, поскольку это не bean-компонент Spring.
  3. Если вы хотите, чтобы ваш тест оставался как есть, иДля работы вам нужно смоделировать метод companyRepository.findById() и сделать так, чтобы он возвращал непустой необязательный параметр.Иначе, конечно, возвращаемое значение является пустым Необязательным, поэтому вызывается обратный вызов orElseThrow(), и вы получаете это исключение.
...