测试时自动连线字段为空

piwo6bdm  于 2021-09-13  发布在  Java
关注(0)|答案(2)|浏览(371)

我试图测试应用程序中的一个简单 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 资源库 predicatenull ,可能是因为这是现场注射。有没有一种方法可以将构造函数注入与其他参数一起使用?

1yjd4xko

1yjd4xko1#

试试这个

@Slf4j
public class NameChangePredicate implements ValidationPredicate {

    String errorCode;
    GeographicZone zone;
    NameChangeRepository nameChangeRepository;

    public NameChangePredicate(String errorCode, GeographicZone zone, NameChangeRepository nameChangeRepository) {
        super();
        this.errorCode = errorCode;
        this.zone = zone;
        this.nameChangeRepository = nameChangeRepository;
    }
...
}

@ActiveProfiles("test")
@SpringBootTest
public class NameChangeTest {

    @Autowired
    NameChangeRepository nameChangeRepository;

    ....

    @Test
    public void testNameChangeParameter() {
        final NameChangePredicate predicate = new NameChangePredicate("", zone, nameChangeRepository);
    }
}

当您“在真实上下文中”运行存储库时,spring将自动将其注入构造函数,并在测试中自动连接它。

kognpnkq

kognpnkq2#

这里混合了两件事:spring配置和构造函数。
创建的示例时 NameChangePredicate 对于构造函数,spring不工作,也不初始化它。
不确定如何更正示例,但看起来您的设计不太正确。 NameChangePredicate 做两件事:充当 predicate 并保存两个字段的逻辑。我建议将这两个字段分开 String errorCode; GeographicZone zone; 并将其注入到一个单独的类中 NameChangePredicateNameChangeRepository .

相关问题