test di unità classe di servizio di avvio Primavera che ha dipendenza da un'altra classe di servizio

voti
0

Sto scrivendo un servizio di riposo avvio di primavera in cui sto cercando di unit test una classe annotato con @Service. Questa classe di servizio utilizza internamente un'altra classe di servizio. Ecco il codice:

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

Ecco il metodo all'interno della classe che avrei bisogno di test di unità:

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

Vorrei prendere in giro il 'DiscountTierService' utilizzato entro 'TieredClaimServiceImpl'

Nella mia classe unit test ho cercato di deridere la chiamata viene fatta a questo servizio:

DiscountTierService discountTierService = mock(DiscountTierService.class);

O

DiscountTierService discountTierService = spy(new DiscountTierServiceImpl());

Nessuno di questi ha lavorato.

Anche se non direttamente correlate avevo una domanda relativa a questo intero solutioning qui

È pubblicato 02/12/2019 alle 23:56
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

Lei sta dicendo su test di unità, ma cercando di creare il test di integrazione

@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 davvero si vuole creare un test di unità, non è necessario la maggior parte delle annotazioni di classe, solo @RunWith, e impostare le proprietà di prova, se necessario (ovviamente, in questo caso, è possibile repository non autowire, solo finta).

Ma se siete alla ricerca sul test di integrazione, dove potrete chiamare un metodo di controllo che chiama il servizio, è necessario creare l'oggetto MockMvc con un controller standalone. E creare l'oggetto controller solo impostare questa configurazione del servizio - in questo caso, è possibile controllare tutti gli oggetti nidificati necessari (servizio, servizio nidificato, repository).

Risposto il 03/12/2019 a 01:02
fonte dall'utente

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