модульного тестирования Spring класс загрузки службы, который имеет зависимость от другого класса обслуживания

голоса
0

Я пишу на службу отдыха весной загрузки, в котором пытаюсь модульного тестирования класса с аннотацией @Service. Этот класс обслуживания внутренне использует другой класс обслуживания. Вот код:

@Service
public class TieredClaimServiceImpl implements TieredClaimService {

//this is the second service used within 
// commented out setter injection and used constructor injection 
// @Autowired
private DiscountTierService discountTierService;

@Autowired
public TieredClaimServiceImpl(MerchRepository merchRepository,SalesRepository 
         salesRepository,DiscountTierService discountTierService) {
    this.merchRepository = merchRepository;
    this.salesRepository = salesRepository;
    this.discountTierService = discountTierService;
}

Вот метод в классе, который я должен был бы модульного тестирования:

@Override
public List <TieredClaimDto>  calculateClaim(ClaimRequestDto claimRequestDto,String xAppCorelationId) throws SystemException {

    /** get the discount tier config data  - this is where we are using the other service **/
    List<DiscountTierDto> discountTierList = discountTierService.get();

Я хотел бы, чтобы дразнить «DiscountTierService» используется в «TieredClaimServiceImpl»

В моем классе модульного тестирования я пытался издеваться призыв к тому, чтобы эту услугу:

DiscountTierService discountTierService = mock(DiscountTierService.class);

ИЛИ

DiscountTierService discountTierService = spy(new DiscountTierServiceImpl());

Ни один из них не работал.

Хотя непосредственно не связаны у меня был вопрос , связанный с этой всей solutioning здесь

Задан 02/12/2019 в 23:56
источник пользователем
На других языках...                            


1 ответов

голоса
0

Вы говорите о единичных испытаниях, но при попытке создать тест интеграции

@SpringBootTest
@ActiveProfules(value = "test")//or @TestPropertySource(s)
@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SomeTestConfiguration.class})
public class SomeTestClass {

    @Autowired//or @Mock
    private MerchRepository merchRepository;

    @Autowired//or @Mock
    private SalesRepository salesRepository;

    @Mock
    private DiscountTierService discountTierService;

    private TieredClaimService service;

    @Before
    public void setup() {
        service = new TieredClaimServiceImpl(merchRepository, salesRepository, discountTierService);
    }

    @Test
    public void test() {
        //arrange
        var dto1 = new DiscountTierDto(...);
        var dto2 = new DiscountTierDto(...);
        var someList = List.of(dto1, dto2);
        when(discountTierService.get()).thenReturn(someList);
        //act
        service.calculateClaim(someClaimRequestDto, someAppCorrelationId);
        //assert
        Assert.assertThat(...);
    }
}

Если вы хотите действительно создать модульный тест, вам не нужно больше всего класса аннотаций, только @RunWith и набор тестовых свойств, если это необходимо (конечно, в этом случае вы не можете autowire хранилищами, просто насмешка).

Но если вы смотрите на тесте интеграции, когда вы вызываете метод контроллера, который вызывает службу, необходимо создать объект MockMvc с контроллером автономного. И создание объекта контроллера просто установить эту конфигурацию службы - в этом случае, вы можете контролировать все необходимые вложенные объекты (услугу, вложенное обслуживание, репозитории).

Ответил 03/12/2019 в 01:02
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more