unit test Spring boot dienst klasse die afhankelijkheid heeft op een andere dienst klasse

stemmen
0

Ik ben het schrijven van een veer boot rust dienst waarin ben op zoek naar unit test een klasse geannoteerd met @Service. Deze service klasse gebruikt intern een andere dienst klasse. Hier is de code:

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

Hier is de methode binnen de klasse die ik nodig zou hebben om unit test:

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

Ik wil graag de 'DiscountTierService' gebruikt worden binnen 'TieredClaimServiceImpl' bespotten

In mijn unit test class heb ik geprobeerd om de oproep te bespotten verwijzingen naar deze service:

DiscountTierService discountTierService = mock(DiscountTierService.class);

OF

DiscountTierService discountTierService = spy(new DiscountTierServiceImpl());

Geen van beide werkte.

Hoewel niet direct gerelateerd ik had een vraag met betrekking tot deze hele solutioning hier

De vraag is gesteld op 02/12/2019 om 23:56
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

U zegt over unit testen, maar proberen om de integratietest creëren

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

Als je echt een unit test te maken, hoeft u niet de meeste klasse annotaties, net @RunWith en set testeigenschappen indien nodig (natuurlijk, in dit geval, kun je niet autowire repositories, net mock).

Maar als je op zoek bent op de integratie test waarbij je een controller methode die de dienst noemt belt, moet u MockMvc object maken met een standalone controller. En het creëren van de controller object stel gewoon deze dienst configuratie - in dit geval, kunt u alle benodigde geneste objecten (service, geneste service, repositories) te controleren.

antwoordde op 03/12/2019 om 01:02
bron van user

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