Java 依赖于另一个服务类的单元测试Spring引导服务类
我正在编写一个SpringBootREST服务,其中我试图对一个用@service注释的类进行单元测试。 此服务类在内部使用另一个服务类。 代码如下:Java 依赖于另一个服务类的单元测试Spring引导服务类,java,spring,spring-boot,unit-testing,mocking,Java,Spring,Spring Boot,Unit Testing,Mocking,我正在编写一个SpringBootREST服务,其中我试图对一个用@service注释的类进行单元测试。 此服务类在内部使用另一个服务类。 代码如下: @Service public class TieredClaimServiceImpl implements TieredClaimService { //this is the second service used within // commented out setter injection and used constructor
@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();
或
DiscountTierService discountTierService = spy(new DiscountTierServiceImpl());
这两个都不起作用
虽然没有直接关系,但我有一个问题与整个解决方案有关你说的是单元测试,但试图创建集成测试
@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,并在必要时设置测试属性(当然,在这种情况下,您不能自动连接存储库,只需模拟)
但是如果您正在查看集成测试,您将调用调用服务的控制器方法,那么您需要使用独立控制器创建MockMvc对象。创建控制器对象只需设置此服务配置—在这种情况下,您可以控制所有必需的嵌套对象(服务、嵌套服务、存储库)。您的单元测试看起来如何?您是如何创建
TieredClaimServiceImpl
——您是启动整个spring上下文以将它们创建为bean,还是使用new
,在没有上下文的情况下手动创建它们?模拟是合适的工具。请解释“不起作用”。
@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(...);
}
}