enhetstest Spring boot serviceklasse som har avhengigheten av en annen tjeneste klasse

stemmer
0

Jeg skriver opp en fjær boot resten tjeneste der prøver å enheten test en klasse merket med @Service. Denne tjenesten klassen bruker internt annen tjeneste klasse. Her er koden:

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

Her er metoden i klassen at jeg måtte enhet 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();

Jeg ønsker å spotte 'DiscountTierService' brukes innen 'TieredClaimServiceImpl'

I min enhet test klasse prøvde jeg å spotte samtalen blir gjort på denne tjenesten:

DiscountTierService discountTierService = mock(DiscountTierService.class);

ELLER

DiscountTierService discountTierService = spy(new DiscountTierServiceImpl());

Ingen av disse arbeidet.

Selv om ikke direkte relatert jeg hadde et spørsmål relatert til dette hele solutioning her

Publisert på 02/12/2019 klokken 23:56
kilden bruker
På andre språk...                            


1 svar

stemmer
0

Du sier om enhet tester, men prøver å skape integrering test

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

Hvis du virkelig ønsker å opprette en enhet test, trenger du ikke de fleste klasse merknader, bare @RunWith og sett testegenskaper ved behov (selvfølgelig, i dette tilfellet, kan du ikke autowire repositories, bare mock).

Men hvis du er ute på integrering test der du vil kalle en kontroller metode som kaller tjenesten, må du opprette MockMvc objekt med en frittstående kontroller. Og skape kontrolleren gjenstanden bare sette denne tjenesten konfigurasjon - i dette tilfellet, kan du styre alle nødvendige nestede objekter (service, nestet service, repositories).

Svarte 03/12/2019 kl. 01:02
kilden bruker

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