gpt4 book ai didi

java - 单元测试依赖于另一个服务类的Spring引导服务类

转载 作者:行者123 更新时间:2023-12-05 05:07:28 26 4
gpt4 key购买 nike

我正在编写一个 spring boot rest 服务,其中我试图对一个用 @Service 注释的类进行单元测试。此服务类在内部使用另一个服务类。这是代码:

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

这是我需要进行单元测试的类中的方法:

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

我想模拟“TieredClaimServiceImpl”中使用的“DiscountTierService”

在我的单元测试类中,我试图模拟对该服务的调用:

DiscountTierService discountTierService = mock(DiscountTierService.class);

DiscountTierService discountTierService = spy(new DiscountTierServiceImpl());

这些都不起作用。

虽然没有直接关系,但我有一个与整个解决方案相关的问题 here

最佳答案

你说的是单元测试,但试图创建集成测试

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

如果你真的想创建一个单元测试,你不需要大多数类注释,只需要@RunWith,并在必要时设置测试属性(当然,在这种情况下,你不能 Autowiring 存储库,只是模拟)。

但是如果您正在查看集成测试,您将在其中调用调用服务的 Controller 方法,则需要使用独立 Controller 创建 MockMvc 对象。创建 Controller 对象只需设置此服务配置 - 在这种情况下,您可以控制所有必需的嵌套对象(服务、嵌套服务、存储库)。

关于java - 单元测试依赖于另一个服务类的Spring引导服务类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59146537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com