Unit-Test-Feder-Boot-Service-Klasse, die Abhängigkeit von einem anderen Serviceklasse

stimmen
0

Ich schreibe einen Feder Boot-Rest-Service, in dem mit @Service kommentierte eine Klasse Unit-Test versuchen. Diese Service-Klasse intern verwendet eine andere Dienstklasse. Hier ist der 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 ist die Methode innerhalb der Klasse, die ich Unit-Test benötigen würde:

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

Ich möchte die ‚DiscountTierService‘ innerhalb ‚TieredClaimServiceImpl‘ verwendet verspotten

In meiner Unit-Test-Klasse habe ich versucht, den Anruf zu verspotten diesen Dienst gemacht wird:

DiscountTierService discountTierService = mock(DiscountTierService.class);

ODER

DiscountTierService discountTierService = spy(new DiscountTierServiceImpl());

Keines dieser gearbeitet.

Obwohl nicht direkt im Zusammenhang hatte ich zu diesem ganzen Solutioning Zusammenhang Frage hier

Veröffentlicht am 02/12/2019 um 23:56
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Sie sagen über Unit-Tests, sondern versuchen, den Integrationstest zu erstellen

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

Wenn Sie wirklich einen Komponententest erstellen möchten, brauchen Sie nicht die meisten Klasse Anmerkungen, nur @RunWith und Set-Testeigenschaften bei Bedarf (natürlich in diesem Fall kann man nicht autowire Repositories, nur mock).

Aber wenn Sie auf den Integrationstest suchen, in dem Sie eine Controller-Methode aufrufen, das den Dienst aufruft, müssen Sie MockMvc Objekt mit einem Standalone-Controller erstellen. Und die Schaffung der Controller-Objekt gerade diesen Service Konfiguration eingestellt - in diesem Fall können Sie alle erforderlichen verschachtelten Objekten steuern (Service, verschachtelte Service, Repositories).

Beantwortet am 03/12/2019 um 01:02
quelle vom benutzer

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