使用@value注释将属性字段传递给模拟方法为null

时间:2018-11-04 04:01:30

标签: java spring mockito

我无法通过从测试中的fieldref文件读取到模拟方法来传递字段。

application-test.properties

这是模拟方法的实际类

@RunWith(SpringRunner.class)
@TestPropertySource("classpath:application-test.properties")
public class ReportImplTest {
    @Mock
    private Dependencies dependencies;

    @InjectMocks
    private ReportImplTest  underTest;

   @Test
    public void testgetReports() {
         List<String> reps= underTest.getReports(anyString());
    }

}

reppropname在@Component public class ReportImpl { @Value("${REP_PROPNAME}") String reppropname; public List<String> getReports(String rep){ return staticUtilityclass.process(staticUtilityclass.transform(reppropname,"Reports")); } } 方法中为空。测试在测试上下文中执行,其中getReports类将在应用程序上下文中。有没有一种方法可以获取ReportImpl的值。 我尝试使用过reppropname 它正在工作,但是会加载所有bean和依赖项。 还有其他获取reppropname的方法吗?

1 个答案:

答案 0 :(得分:1)

此处未注入值的原因是您没有为测试类提供配置。 Spring只是不知道如何构建您的bean。 因此,正如您提到的,您必须使用npm start注释测试类。如果您不想使用所有bean构建整个上下文,则可以提供创建测试配置的方法,并仅在其中提供所需的bean。

@ContextConfiguration

现在将此类提供给您的测试

@Configuration //can be as well annotated with @TestConfiguration
@ComponentScan("package.to.scan")
public class TestConfiguration {
}

但是还有一件事。假设您有一个执行@RunWith(SpringRunner.class) @TestPropertySource("classpath:application-test.properties") @ContextConfiguration(classes = TestConfiguration.class) public class ReportImplTest { ........ } 的{​​{1}}方法,那么仍然只有@Before声明了被测对象。这是什么意思?这意味着,如果您不自行初始化该对象,则模仿将处理该对象,并使用可用的构造函数进行初始化,在这种情况下,spring不会注入MockitAnnotations.initMocks(this);带注释的字段。您需要做的是用@InjectMocks来标注被测对象,这样spring会在模仿之前尝试初始化它:

@Value