自动装配的 ObjectMapper 在 @DataJpaTest 期间为空

autowired ObjectMapper is null during @DataJpaTest

我想使用 @DataJpaTest.

测试 AttributeConverter 的实现

测试码

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class FooRepositoryTest {

    @Autowired
    private FooRepository repository;

    @Test
    void getPojoTest(){
        FooEntity fooEnity= repository.findById("foo");
        FooPojo fooPojo = fooEntity.getJsonPojo()
        //some assertion
        

    }
}

实体

@Entity
@Data
@NoArgsConstructor
public class FooEntity{

    ....

    @Column(columnDefinition= "JSON")
    @Convert(converter = FooConverter.class)
    private FooPojo data;

    ....
}

属性转换器


public class FooConverter implements AttributeConverter<FooPojo, String> {

    @Autowired
    private ObjectMapper mapper;

    @SneakyThrows
    @Override
    public String convertToDatabaseColumn(FooPojo attribute) {
        return mapper.writeValueAsString(attribute);
    }

    @SneakyThrows
    @Override
    public FooPojo convertToEntityAttribute(String dbData) {
        return mapper.readValue(dbData, FooPojo.class);
    }
}

用我上面的代码,当我运行getPojoTest()时,Converter中的@autowiredOjbectMappernull。当我用 @SpringBootTest 尝试相同的测试时,它工作得很好。我想知道是否有任何解决方法可以一起使用 @DataJpaTestObjectMapper

来自Docs

@DataJpaTest can be used if you want to test JPA applications. By default it will configure an in-memory embedded database, scan for @Entity classes and configure Spring Data JPA repositories. Regular @Component beans will not be loaded into the ApplicationContext.

与创建自己的 ObjectMapper 相比,更好的选择是添加 @AutoConfigureJson 注释:

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@AutoConfigureJson
public void FooRepositoryTest {

}

这也是@JsonTest使用的。