我试图测试应用程序中的一个简单 predicate 。这个 predicate 使用存储库来检查一些数据,但是当我测试它时,存储库总是 null
,即使它在实际环境中运行良好。
以下是 predicate :
@Slf4j
public class NameChangePredicate implements ValidationPredicate {
@Autowired
NameChangeRepository nameChangeRepository;
String errorCode;
GeographicZone zone;
public NameChangePredicate(String errorCode, GeographicZone zone) {
super();
this.errorCode = errorCode;
this.zone = zone;
}
/**
* Test the condition
*
* @param response the {@link ValidationServiceResponse}
* @return true if valid
*/
@Override
public boolean test(ValidationServiceResponse response) {
if (!StringUtils.isBlank(response.getClass()) && zone != null) {
List<NameChange> nameChanges = nameChangeRepository.findAllByGeographicZoneId(zone.getId());
if (nameChanges.stream().anyMatch(n -> n.getClasses().stream().anyMatch(response.getClass()::equalsIgnoreCase))) {
return true;
}
}
throw new ValidationException(this.errorCode);
}
}
以下是我的简单测试:
@ActiveProfiles("test")
@SpringBootTest
public class NameChangeTest {
@Autowired
NameChangeRepository nameChangeRepository;
@Autowired
GeographicZoneRepository geographicZoneRepository;
private GeographicZone zone;
@BeforeEach
public void init() {
....
}
@Test
public void testNameChangeParameter() {
final NameChangePredicate predicate = new NameChangePredicate("", zone);
List<NameChange> list = nameChangeRepository.findAll();
Assert.assertEquals("There should be 4 NameChange in db", 4, list.size());
ValidationServiceResponse response = new ValidationServiceResponse();
response.setBookingClass("C");
Assert.assertTrue("Name change should be eligible", predicate.test(response));
}
}
但是在测试环境中 @Autowired
资源库 predicate
是 null
,可能是因为这是现场注射。有没有一种方法可以将构造函数注入与其他参数一起使用?
2条答案
按热度按时间1yjd4xko1#
试试这个
当您“在真实上下文中”运行存储库时,spring将自动将其注入构造函数,并在测试中自动连接它。
kognpnkq2#
这里混合了两件事:spring配置和构造函数。
创建的示例时
NameChangePredicate
对于构造函数,spring不工作,也不初始化它。不确定如何更正示例,但看起来您的设计不太正确。
NameChangePredicate
做两件事:充当 predicate 并保存两个字段的逻辑。我建议将这两个字段分开String errorCode; GeographicZone zone;
并将其注入到一个单独的类中NameChangePredicate
与NameChangeRepository
.