【问题标题】:Mocked repository becoming null in service模拟存储库在服务中变为空
【发布时间】:2020-09-17 07:28:43
【问题描述】:

您好,我有一个 springboot 应用程序,它有一个服务,其中存储库在测试用例中被模拟但没有被模拟。下面是我的代码示例

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

我的仓库类在这里:

@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,否则也很好。当我模拟存储库时,它不会被模拟,而是在服务中被视为 null。

请告诉我如何模拟我的服务。

【问题讨论】:

    标签: java junit mocking powermock


    【解决方案1】:

    在我看来,您好像忘记在测试中将存储库注入到服务中。

    在“生产”中,Spring 会为您处理此问题,但在测试中您使用的是 Mockito。您有两种选择,一种是使用 Spring 的测试基础设施,另一种是在服务上提供一个构造函数,该构造函数采用 Repository 的实例。

    类似:

    @Service("HRfeedService")
    public class HRfeedService {
    
       ... rest of class
    
       @Autowired
       private HRfeedRepository hRfeedRepository;
    
       public HRfeedService(HRfeedRepository hRfeedRepository) {
          this.hRfeedRepository = hRfeedRepository;
       }
    
       ... rest of class
    }
    

    在测试类的@Before 中类似:

       hRfeedService = new HRfeedService(mockRepository);
    

    mockRepository 如果您使用 Mockito 设置了存储库模拟。

    就我个人而言,我倾向于使用构造函数而不是字段来进行自动装配,这使我可以将字段设置为最终字段,而且我通常可以省略 @Autowired,因为 Spring 可以解决这个问题。

    【讨论】:

    • 感谢您的回答,但是如何在服务中提供存储库的构造函数?
    • @SusmithaThallapally 我有一个粗略的例子来说明我的意思。构造函数是一个标准的Java构造函数,取一个HRfeedRepository的实例,你只需要在你的setUp方法中创建实例时调用构造函数。
    • 优秀。解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    相关资源
    最近更新 更多