我无法通过从测试中的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的方法吗?
答案 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