我实现了一个工厂模式,想测试一下。除了这个工厂方法中的字段没有 Autowiring 。工厂类中的 @Autowired 属性似乎保持为空。 我不能使用@SpringBootTest 注解,因为那时会加载区 block 链配置文件
下面是服务工厂的代码,parserfactory在测试中被正确地 Autowiring 。问题在于 parserfactory 的 Autowiring 字段
@Service
@Slf4j
public class ParserFactory {
@Autowired
OsirisParser osirisParser;
public Parser getParser(String system) {
if (system == null) {
return null;
}
if (system.equalsIgnoreCase("Progress")) {
return ProgressCreateService();
}
if (system.equalsIgnoreCase("Osiris")) {
log.debug("Osiris parsen creëren");
return OsirisCreateService();
}
return null;
}
public OsirisParser OsirisCreateService() {
return osirisParser;
}
public OsirisParser ProgressCreateService() {
return new OsirisParser("ProgressParser");
}
测试
@RunWith(SpringRunner.class)
public class FactoryTest {
@Mock
ParserFactory serviceCallFactory;
@Test
public void testCreateOsirisServiceSuccesFull() {
Parser serv = serviceCallFactory.getParser("Osiris");
assertThat(serv, instanceOf(OsirisParser.class));
}
@Test
public void testCreateProgressServiceSuccesFull() {
Parser serv = serviceCallFactory.getParser("Progress");
assertThat(serv, instanceOf(ProgressParser.class));
}
@Test
public void testCreateProgressServiceUnSuccessFull() {
Parser serv = serviceCallFactory.getParser("Progrddess");
assertThat(serv, is(not(instanceOf(OsirisParser.class))));
}
@Test
public void testCreateWhenStringIsNotCorrect() {
Parser serv = serviceCallFactory.getParser("0$iri$");
assertThat(serv, is(nullValue()));
}
@Test
public void testCreateWhenStringIsNull() {
Parser serv = serviceCallFactory.getParser("");
assertThat(serv, is(nullValue()));
}
}
最佳答案
您的测试类中没有任何 spring 上下文,这意味着您正在测试一个没有 spring 初始化的 POJO,因此 Autowiring 不会发生并且该字段为空。
有几种方法可以解决:
如果你想像 POJO 一样测试它,在测试类上设置字段。您可以在当前实现中使用
@InjectMocks
、ReflectionTestUtils.setField
,或者将@Autowire
移至构造函数或 setter 并在中创建类现场测试。我投票赞成在构造函数上 Autowiring如果您希望它作为 spring 组件进行测试,请定义一个
@TestConfiguration
并在其中导入您的真实配置并覆盖您不想使用的 beans,或使用完全不同的 Spring 配置进行测试。
两种方式都行,选择更适合自己的一种
关于java - 嵌套的 Autowiring 字段在 JUNIT 测试中保持为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56806646/