【发布时间】:2020-03-05 01:24:57
【问题描述】:
我想实现 JUnit 5 测试以测试服务:
JPA 存储库:
@Repository
public interface RiskFilterRepository extends JpaRepository<RiskFilters, Integer> {
.....
}
服务接口:
public interface RiskFilterService {
......
}
服务实现:
@Service
@Qualifier("riskFilterService")
@Transactional
public class RiskFilterServiceImpl implements RiskFilterService {
@PersistenceContext
private EntityManager entityManager;
@Autowired
private RiskFilterRepository dao;
...
}
测试服务:
@Service
public class BinCountryCheckFilterImpl {
@Autowired
@Qualifier("riskFilterService")
private RiskFilterService riskFilterService;
public BinCountryCheckFilterImpl(Terminals terminal) {
this.terminal = terminal;
}
public void validateBinCountryCheckFilter() throws JAXBException, JsonProcessingException {
List<RiskFilters> filter_list = riskFilterService.findRiskFiltersByTerminalIdAndType(terminal.getId(), "BinCountryCheckFilter");
}
}
JUnit 测试
public class BinCountryCheckFilterImplTest {
@Autowired
private RiskFilterRepository repository;
@BeforeEach
public void beforeEachTest() throws IOException {
MockitoAnnotations.initMocks(this);
}
@Test
public void testBinCountryCheckFilterImpl() throws JsonProcessingException, JAXBException {
// this mock is working fine
BDDMockito.given(riskFilterService.findRiskFiltersByTerminalIdAndType(anyInt(), anyString())).willReturn(riskFiltersList);
// this mock is working fine - I don't get NPE
List<RiskFilters> filter_list = riskFilterService.findRiskFiltersByTerminalIdAndType(11, "BinCountryCheckFilter");
// this mock is working fine
BinCountryCheckFilterImpl binCountryCheckFilterImpl = new BinCountryCheckFilterImpl(terminal);
// I get NPE here
binCountryCheckFilterImpl.validateBinCountryCheckFilter();
}
}
当我为此 Java 方法 validateBinCountryCheckFilter() 运行 JUnit 代码时出现 NPE 错误。
List<RiskFilters> filter_list = riskFilterService.findRiskFiltersByTerminalIdAndType(11, "BinCountryCheckFilter");
所以当我第一次使用BDDMockito.given.... 运行代码时,模拟的SQL 查询riskFilterService.findRiskFiltersByTerminalIdAndType.... 工作正常。
但是在第二次运行binCountryCheckFilterImpl.validateBinCountryCheckFilter(); 之后,我得到了代码riskFilterService.findRiskFiltersByTerminalIdAndType.... 的NPE
你知道我该如何解决这个问题吗?
【问题讨论】:
-
我不确定 BDDMockito,但在某些框架中,您需要分别模拟连续调用的结果:
.willReturn(riskFiltersList).willReturn(riskFiltersList). -
很可能被测对象没有使用模拟。而且由于没有分配依赖关系,因此您将获得 NPE。为什么不像终端一样将其显式注入主题。
-
模拟在哪里?您在测试中从哪里获得 riskFilterService ?为什么不通过构造函数注入依赖项?
-
确实,@Nkosi 说了什么...
BinCountryCheckFilterImpl binCountryCheckFilterImpl = new BinCountryCheckFilterImpl(terminal);中的terminal是在哪里定义的? -
@ZeroOne Terminal 它只是一个 Java 对象。
标签: java spring spring-boot junit junit5