Java 为Spring服务实现JUnit测试

Java 为Spring服务实现JUnit测试,java,spring,mockito,junit5,Java,Spring,Mockito,Junit5,我想为这个Spring服务实现JUnit测试: @Service public class BinCountryCheckFilterImpl { @Autowired @Qualifier("riskFilterService") private RiskFilterService riskFilterService; @Autowired

我想为这个Spring服务实现JUnit测试:

        @Service
        public class BinCountryCheckFilterImpl {

            @Autowired
            @Qualifier("riskFilterService")
            private RiskFilterService riskFilterService;

            @Autowired
            @Qualifier("binlistsService")
            private BinlistsService binlistsService;

            public BinCountryCheckFilterImpl() {        
            }

            public PaymentResponse validateBinCountryCheckFilter(Merchants merchant, Contracts contract, Terminals terminal,
                      PaymentTransaction message, HttpServletRequest request) throws JAXBException, JsonProcessingException {

                     List<RiskFilters> filter_list = riskFilterService.findRiskFiltersByTerminalIdAndType(terminal.getId(), "BinCountryCheckFilter");

                     Optional<BinLists> db_bin_list = binlistsService.findByName(billing_address_country);
             }
       }
@服务
公共类BinCountryCheckFilterImpl{
@自动连线
@限定词(“riskFilterService”)
私人RiskFilterService RiskFilterService;
@自动连线
@限定符(“binlistsService”)
私有BinlistsService BinlistsService;
public BinCountryCheckFilterImpl(){
}
公共支付响应验证InCountryCheckFilter(商户、商户、合同、终端、,
PaymentTransaction消息,HttpServletRequest请求)抛出JAXBEException,JsonProcessingException{
List filter\u List=riskFilterService.findriskFiltersByTerminalidType(terminal.getId(),“BinCountryCheckFilter”);
可选db_bin_list=binlistsService.findByName(账单地址国家/地区);
}
}
我尝试了这个JUnit测试:

public class BinCountryCheckFilterImplTest {

    @InjectMocks
    private BinCountryCheckFilter binCountryCheckFilter;

    private BinlistsService binlistsService = Mockito.mock(BinlistsService.class);  
    private RiskFilterService riskFilterService = Mockito.mock(RiskFilterService.class);

    @Mock
    List<RiskFilters> riskFiltersList = null;

    Optional<BinLists> binList = null;

    @BeforeEach
    public void beforeEachTest() throws IOException {

        MockitoAnnotations.initMocks(this);             
        riskFiltersList = new ArrayList<RiskFilters>(); 

        RiskFilters filter = new RiskFilters();
        riskFiltersList.add(filter);    

        BinLists binLists = new BinLists();
        binList = Optional.of(binLists);
    }

    @Test
    public void testBinCountryCheckFilterImpl() throws JsonProcessingException, JAXBException {

        when(riskFilterService.findRiskFiltersByTerminalIdAndType(anyInt(), anyString())).thenReturn(riskFiltersList);
        when(binlistsService.findByName(anyString())).thenReturn(binList);

        List<RiskFilters> filter_list = riskFilterService.findRiskFiltersByTerminalIdAndType(11, "BinCountryCheckFilter");

        Optional<BinLists> bin = binlistsService.findByName("US");

        BinCountryCheckFilterImpl binCountryCheckFilterImpl = new BinCountryCheckFilterImpl();

        binCountryCheckFilterImpl.validateBinCountryCheckFilter(merchant, contract, terminal, authorizeTransactiontMockup(), request);
    }
公共类BinCountryCheckFilterImplTest{
@注射模拟
私有BinCountryCheckFilter BinCountryCheckFilter;
私有BinlistsService BinlistsService=Mockito.mock(BinlistsService.class);
私有RiskFilterService RiskFilterService=Mockito.mock(RiskFilterService.class);
@嘲弄
List riskFiltersList=null;
可选的binList=null;
@之前
public void beforeachtest()引发IOException{
initMocks(this);
riskFiltersList=新建ArrayList();
RiskFilters filter=新的RiskFilters();
riskFiltersList.add(过滤器);
BinLists BinLists=新的BinLists();
binList=可选。of(binList);
}
@试验
public void testBinCountryCheckFilterImpl()抛出JsonProcessingException、JAXBEException{
when(riskFilterService.findriskFiltersByTerminalidType(anyInt(),anyString())。然后返回(riskFiltersList);
when(binlistsService.findByName(anyString()).thenReturn(binList);
List filter_List=riskFilterService.FindriskFiltersByTerminalidType(11,“BinCountryCheckFilter”);
可选bin=binlistsService.findByName(“US”);
BinCountryCheckFilterImpl BinCountryCheckFilterImpl=新的BinCountryCheckFilterImpl();
binCountryCheckFilterImpl.validateBinCountryCheckFilter(商户、合同、终端、授权交易锁定()、请求);
}
当我尝试在
时用
模拟请求时,代码工作正常,但当我调用实际的Spring服务以便在服务Java类
BinCountryCheckFilterImpl
的这一行用NPE测试它时,代码失败了:

List filter\u List=riskFilterService.findRiskFiltersByTerminalIdAndType(terminal.getId(),“BinCountryCheckFilter”);


如何模拟此SQL查询?

我假设
riskFilterService
是一个接口和/或spring存储库

你能试一下吗

doReturn(riskFiltersList).when(riskFilterService).findRiskFiltersByTerminalIdAndType(any(), any()));
与when/return相比,这个(doReturn/when)几乎可以避免调用该方法


这是一个接口吗?
riskFilterService
和/或这是spring数据存储库?我不确定这样的自动关联字段,如果你将它们设置为构造函数参数,你就可以更好地控制它们。这可能是你问题的一部分,你自动关联的字段是空的吗?你的问题不清楚。请输入NPE stacktrace是的,这是一个JavaInterface@Randycan您详细说明了将参数与构造函数一起使用的优点是什么?