模拟存储库在服务中变为空
Mocked repository becoming null in service
嗨,我有一个 springboot 应用程序,它有一个服务,其中存储库在测试用例中被模拟,但它没有得到 mocked.Below 是我的代码示例
@Service("HRfeedService")
public class HRfeedService {
@Autowired
private HRfeedRepository hRfeedRepository;
public boolean getBBHRFeedDetails(String sid){
List<HRfeed> list = hRfeedRepository.getHRfeedDetailsBySID(sid);
if(list.size()>0){
bbHrStatus = true;
}
return bbHrStatus;
}
}
我的存储库 class 在这里:
@Repository
public interface HRfeedRepository extends JpaRepository<HRfeed,HRfeedID> {
@Query(value = "select * from HRFEED_Details hr where hr.sid= ?1 and ACTIVE_FLAG='1'",nativeQuery = true)
public List<HRfeed> getHRfeedDetailsBySID(String sid);
}
我的测试类在这里:
@RunWith(SpringJUnit4ClassRunner.class)
public class TestHRfeedService2 {
String sid="A123456";
@InjectMocks
private HRfeedService hRfeedService;
@Mock
HRfeedRepository hRfeedRepository;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
hRfeedService = new HRfeedService();
}
@Test
public void testGetBBHRFeedDetails() throws Exception
{
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yy hh.mm.ss.SSSSSSSSS a");
ArrayList<HRfeed> list = new ArrayList<>();
HRfeed hRfeed = new HRfeed();
hRfeed.setSid("A123456");
hRfeed.setEmail("test@gmail.com");
hRfeed.setACTIVE_FLAG('1');
Timestamp timestamp = new Timestamp(dateFormat.parse("19-NOV-19 04.43.17.740000000 PM").getTime());
hRfeed.setEFF_UNTIL_DATE(timestamp);
hRfeed.setEFF_ASOF_DATE(timestamp);
list.add(hRfeed);
Mockito.when(hRfeedRepository.getHRfeedDetailsBySID(anyString())).thenReturn(list);
boolean result = hRfeedService.getBBHRFeedDetails(sid);
assertEquals(result,true);
}
}
如果可能的话,我想使用 powermockrunner,否则我也会 fine.When 我正在模拟存储库,它不会被模拟,而是在服务中被视为 null。
请告诉我如何模拟我的服务。
在我看来,您似乎忘记在测试中将存储库注入到服务中。
在“生产”中 Spring 将为您处理此问题,但在测试中您使用的是 Mockito。您有两种选择,一种是使用 Spring 的测试基础设施,另一种是在采用存储库实例的服务上提供构造函数。
类似于:
@Service("HRfeedService")
public class HRfeedService {
... rest of class
@Autowired
private HRfeedRepository hRfeedRepository;
public HRfeedService(HRfeedRepository hRfeedRepository) {
this.hRfeedRepository = hRfeedRepository;
}
... rest of class
}
在测试的 @Before
中 class 类似于:
hRfeedService = new HRfeedService(mockRepository);
其中 mockRepository
如果您使用 Mockito 设置了存储库模拟。
就我个人而言,我倾向于使用构造函数而不是字段来进行自动装配,这使我可以使我的字段成为最终字段,并且通常我可以省略 @Autowired
因为 Spring 可以解决。
嗨,我有一个 springboot 应用程序,它有一个服务,其中存储库在测试用例中被模拟,但它没有得到 mocked.Below 是我的代码示例
@Service("HRfeedService")
public class HRfeedService {
@Autowired
private HRfeedRepository hRfeedRepository;
public boolean getBBHRFeedDetails(String sid){
List<HRfeed> list = hRfeedRepository.getHRfeedDetailsBySID(sid);
if(list.size()>0){
bbHrStatus = true;
}
return bbHrStatus;
}
}
我的存储库 class 在这里:
@Repository
public interface HRfeedRepository extends JpaRepository<HRfeed,HRfeedID> {
@Query(value = "select * from HRFEED_Details hr where hr.sid= ?1 and ACTIVE_FLAG='1'",nativeQuery = true)
public List<HRfeed> getHRfeedDetailsBySID(String sid);
}
我的测试类在这里:
@RunWith(SpringJUnit4ClassRunner.class)
public class TestHRfeedService2 {
String sid="A123456";
@InjectMocks
private HRfeedService hRfeedService;
@Mock
HRfeedRepository hRfeedRepository;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
hRfeedService = new HRfeedService();
}
@Test
public void testGetBBHRFeedDetails() throws Exception
{
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yy hh.mm.ss.SSSSSSSSS a");
ArrayList<HRfeed> list = new ArrayList<>();
HRfeed hRfeed = new HRfeed();
hRfeed.setSid("A123456");
hRfeed.setEmail("test@gmail.com");
hRfeed.setACTIVE_FLAG('1');
Timestamp timestamp = new Timestamp(dateFormat.parse("19-NOV-19 04.43.17.740000000 PM").getTime());
hRfeed.setEFF_UNTIL_DATE(timestamp);
hRfeed.setEFF_ASOF_DATE(timestamp);
list.add(hRfeed);
Mockito.when(hRfeedRepository.getHRfeedDetailsBySID(anyString())).thenReturn(list);
boolean result = hRfeedService.getBBHRFeedDetails(sid);
assertEquals(result,true);
}
}
如果可能的话,我想使用 powermockrunner,否则我也会 fine.When 我正在模拟存储库,它不会被模拟,而是在服务中被视为 null。
请告诉我如何模拟我的服务。
在我看来,您似乎忘记在测试中将存储库注入到服务中。
在“生产”中 Spring 将为您处理此问题,但在测试中您使用的是 Mockito。您有两种选择,一种是使用 Spring 的测试基础设施,另一种是在采用存储库实例的服务上提供构造函数。
类似于:
@Service("HRfeedService")
public class HRfeedService {
... rest of class
@Autowired
private HRfeedRepository hRfeedRepository;
public HRfeedService(HRfeedRepository hRfeedRepository) {
this.hRfeedRepository = hRfeedRepository;
}
... rest of class
}
在测试的 @Before
中 class 类似于:
hRfeedService = new HRfeedService(mockRepository);
其中 mockRepository
如果您使用 Mockito 设置了存储库模拟。
就我个人而言,我倾向于使用构造函数而不是字段来进行自动装配,这使我可以使我的字段成为最终字段,并且通常我可以省略 @Autowired
因为 Spring 可以解决。