test unitaire classe de service de démarrage du printemps qui a une dépendance à une autre classe de service

voix
0

Je vous écris un service de repos de démarrage de printemps qui essaie de test unitaire une classe annotée avec @Service. Cette classe de service utilise en interne une autre classe de service. Voici le 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;
}

Voici la méthode dans la classe que je besoin de test unitaire:

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

Je voudrais se moquer de la « DiscountTierService » utilisé dans « TieredClaimServiceImpl »

Dans ma classe de test unitaire j'ai essayé de se moquer de l'appel étant fait à ce service:

DiscountTierService discountTierService = mock(DiscountTierService.class);

OU

DiscountTierService discountTierService = spy(new DiscountTierServiceImpl());

Aucune de ces travaillé.

Bien que non directement lié j'avais une question liée à toute cette mise en solution ici

Créé 02/12/2019 à 23:56
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Vous dites au sujet des tests unitaires mais en essayant de créer le test d'intégration

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

Si vous voulez vraiment créer un test unitaire, vous n'avez pas besoin la plupart des annotations de classe, juste @RunWith, et les propriétés de test ensemble si nécessaire (bien sûr, dans ce cas, vous ne pouvez pas les dépôts autowire, juste maquette).

Mais si vous êtes à la recherche sur le test d'intégration où vous appelez une méthode du contrôleur qui appelle le service, vous devez créer un objet MockMvc avec un contrôleur autonome. Et la création de l'objet contrôleur vient de mettre cette configuration de service - dans ce cas, vous pouvez contrôler tous les objets imbriqués requis (service, services imbriqués, dépôts).

Créé 03/12/2019 à 01:02
source utilisateur

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