teste de unidade classe de serviço de inicialização Primavera que tem dependência de outro classe de serviço

votos
0

Estou escrevendo um serviço resto inicialização primavera em que estou tentando unidade testar uma classe anotada com @Service. Esta classe de serviço internamente usa outra classe de serviço. Aqui está o código:

@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;
}

Aqui está o método dentro da classe que eu precisaria para teste de unidade:

@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();

Gostaria de zombar do 'DiscountTierService' usado dentro 'TieredClaimServiceImpl'

Na minha classe de teste de unidade Tentei zombar da chamada que está sendo feito para este serviço:

DiscountTierService discountTierService = mock(DiscountTierService.class);

OU

DiscountTierService discountTierService = spy(new DiscountTierServiceImpl());

Nenhuma delas funcionou.

Apesar de não ser diretamente relacionados eu tinha uma pergunta relacionada com todo este solutioning aqui

Publicado 02/12/2019 em 23:56
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Você está dizendo sobre testes de unidade, mas tentando criar o teste de integração

@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(...);
    }
}

Se você quer realmente para criar um teste de unidade, você não precisa a maioria das anotações de classe, apenas @RunWith e propriedades de ensaio estabelecidos, se necessário (claro que, neste caso, você pode repositórios não autowire, apenas simulada).

Mas se você está olhando para o teste de integração, onde você vai chamar um método de controlador que chama o serviço, você precisa criar MockMvc objeto com um controlador autônomo. E criar o objeto controlador apenas definir essa configuração de serviço - neste caso, você pode controlar todos os objetos aninhados necessários (Serviço, aninhada, repositórios).

Respondeu 03/12/2019 em 01:02
fonte usuário

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