首页 > 解决方案 > 如何在springboot中将@Value属性从application.properties注入@InjectMocks?

问题描述

批处理服务.java

@Service
public class BatchService {

   
    @Value("#{${priority.mapping}}")
    public Map<String, String> priorMap;

    @Autowired
    private Repo payload;
    
    public boolean createAndAddBatches(){

        for (String priority: priorMap.keySet()) {
       // code
        }
    }
}

批处理服务测试.java

@RunWith(PowerMockRunner.class)
public class BatchServiceTest {

    @Value("#{${priority.mapping}}")
    private static Map<String, String> priorMap;


    @Mock
    private Repo repoMock;

    @InjectMocks
    private BatchService batchService;

    @BeforeClass
    @PrepareForTest({LogManager.class})
    public static void setup() {
        
        ReflectionTestUtils.setField(BatchService.class, "priorMap", priorMap);
    }

错误

java.lang.IllegalAccessError: class javax.xml.parsers.FactoryFinder (in unnamed module @0xc3cdf38) cannot access class jdk.xml.internal.SecuritySupport (in module java.xml) because module java.xml does not export jdk.xml.internal to unnamed module @0xc3cdf38

应用程序属性

priority.mapping = {'first':'1','second':'2','third':'3'}

有没有办法将属性文件中的哈希映射注入 BatchService?当我使用ReflectionTestUtils.setField(BatchService.class, "priorMap", priorMap);时它会抛出错误

标签: spring-bootunit-testingjunitmockitopowermockito

解决方案


不要使用 BatchService.class,使用您正在测试的实例:

@BeforeEach
public void init() throws Exception {
    ReflectionTestUtils.setField(batchService, "priorMap", "value you want to inject");
}

推荐阅读