【发布时间】:2019-08-24 12:19:36
【问题描述】:
我想为服务方法编写单元测试,但我的服务是以通用方式编写的。我的服务扩展了通用服务,在通用服务中,我们有自定义通用存储库依赖项和通用存储库。
public class MyService extends GenericService<MyService, Long> {
private final MyServiceRepository myServiceRepo;
private final AnotherRepository anotherRepository;
@Autowired
public MyService(MyServiceRepository myServiceRepo, AnotherRepository anotherRepository)
{
super(myServiceRepo , MyEntity.class);
this.myServiceRepo= myServiceRepo;
this.anotherRepository = anotherRepository ;
}
// specific custom service method for MyEntity service
}
================================================ ===============
public class GenericService<T,ID extends Serializable>{
@Autowired
private CustomGenericRepository customRepository;
private GenericRepository<T, ID> genericRepository;
public GenericService(GenericRepository<T, ID> genericRepository , Class entity) {
this.genericRepository = genericRepository;
this.entity = entity;
}
@Transactional(propagation = Propagation.REQUIRED)
public Response add(T t) {
Optional o= genericRepository.findById(id);
if(o!=null){
t1 = genericRepository.save(t);
return "adding data is succussfully"
}else{
throw new RecordAlreadyExistException(entityClass, "id", getId(t));
}
}
}
在此代码中GenericRepository 继承JpaRepository。
我的测试课是:
@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
public class GroupServiceTest {
@Mock
private MyEntityRepository repo;
@Mock
private AnotherRepository anotherRepo;
@Mock
private CustomGenericRepository customGenericRepository;
@Mock
private GenericRepository<MyEntity,Long> genericRepository ;
@InjectMocks
private MyService service;
@Test
public void testServiceAddMethod(){
MyEntity data = new MyEntity();
data.setId(1L);
Mockito.when(repo.save(data)).thenReturn(data);
Mockito.when(genericRepository.findById(1L)).thenReturn(optional.empty());
service.add(data);
Mockito.verify(repo,Mockito.times(1)).save(data);
}
}
我使用这个 maven 依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.7.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.7.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
</dependency>
我现在应该如何解决这个问题?有没有办法模拟GenericRepository?
【问题讨论】:
标签: unit-testing spring-boot nullpointerexception mocking mockito