Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用弹簧&x27;在不启动整个上下文的情况下进行属性注入_Java_Spring_Unit Testing - Fatal编程技术网

Java 使用弹簧&x27;在不启动整个上下文的情况下进行属性注入

Java 使用弹簧&x27;在不启动整个上下文的情况下进行属性注入,java,spring,unit-testing,Java,Spring,Unit Testing,由于速度原因,我想在不需要Spring上下文的情况下运行一些单元测试。 但我也喜欢将文件注入测试的方式 下面是我使用的一个示例测试代码: @ContextConfiguration() @SpringBootTest @RunWith(SpringRunner.class) public class XmlRestructureApplierTest { @Value("classpath:export.xml") private Resource exportedXML; priv

由于速度原因,我想在不需要Spring上下文的情况下运行一些单元测试。 但我也喜欢将文件注入测试的方式

下面是我使用的一个示例测试代码:

@ContextConfiguration()
@SpringBootTest
@RunWith(SpringRunner.class)
public class XmlRestructureApplierTest {
  @Value("classpath:export.xml")
  private Resource exportedXML;
  private XmlRestructureApplier applier;


  @Test
  public void shouldRestructureArrayToObjectWithGivenKey() throws IOException, XPathExpressionException, SAXException {
    List<JSONObject> productsAsJSONObjects = XmlElementExtractor.extractToJSON(exportXML.getInputStream(), "PRV");
    assertThat(productsAsJSONObjects).hasSize(6);
  }
}
@ContextConfiguration()
@春靴测试
@RunWith(SpringRunner.class)
公共类XMLApplierTest{
@值(“classpath:export.xml”)
私有资源导出XML;
私人申请者申请者;
@试验
public void应使用givenkey()重新构造ArrayTobjects引发IOException、XPathExpressionException、SAXException{
List productsAsJSONObjects=XmlElementExtractor.extractToJSON(exportXML.getInputStream(),“PRV”);
资产(productsAsJSONObjects).hasSize(6);
}
}
我只想使用方便的方法来使用
@Value
,而不用启动整个耗时的上下文


这可能吗?

您可以使用测试空配置进行此类测试,这将提高性能。在下面的示例中,
@SpringBootTest
仅加载嵌入的
EmptyTestContext
,而不是搜索所有
SpringBootConfiguration

@SpringBootTest
@RunWith(SpringRunner.class)
public class DemoMvcApplicationTest {
    @Value("${test.value}")
    private String value;

    @Test
    public void propertyHasValidValue() {
        assertThat(value).isEqualTo("TestValue1");
    }

    @Configuration
    public static class EmptyTestContext {}
}
此外,为了提高可读性,您还可以添加:

@SpringBootTest(classes = DemoMvcApplicationTest.EmptyTestContext.class)
它也有同样的效果

更新,更轻量级的变体:

@RunWith(SpringRunner.class)
@ContextConfiguration
public class DemoMvcApplicationTest {
    @Value("${test.value}")
    private String value;

    @Test
    public void propertyHasValidValue() {
        assertThat(value).isEqualTo("TestValue1");
    }

    @Configuration
    @PropertySource("classpath:application.properties")
    public static class EmptyTestContext {}
}

这是唯一的办法吗?所以spring没有现成的东西来供应?我的意思是这是一个合适的用例,不是吗?这也是你的方法的最佳实践吗?不幸的是,这是我知道的唯一方法。我认为,如果您想要控制应用程序配置,那么这是一个合适的用例。例如,您使用
application.yml
,很难找到破坏配置的额外空间。仅为了使用
@Value
而将
@springbootest
与空配置一起使用,未免有些过火。使用带有空配置的
@ContextConfiguration
。显然,在这种情况下,Spring Boot的使用并不有趣。使用
@SpringBootTest
仍然可以启用许多Spring Boot(自动)配置。不需要的功能。@M.Deinum,谢谢,我刚刚添加了带有
@ContextConfiguration
的变体,所以您想要框架提供的功能,但不想使用框架?相比之下,您希望使用JPA注释,而不是hibernate来生成查询,但仍然需要查询。此测试看起来像一个单元测试,但却是作为集成测试编写的(从
@Autowired
判断)。如果您不想这样做,那么就不要使用Spring进行测试,只需自己编写一个简单的单元测试来实例化对象,自己阅读
export.xml
(或者使用
ClassPathResource
)即可。谢谢,我完全了解我的要求。我知道如何通过普通方法获取资源。我仍然希望使用部分框架,而不是整个mashup。
@Autowired
部件被错误地留在里面。将对其进行编辑您至少需要
SpringRunner
才能启用该功能。但是如果你真的不需要它,为什么还要麻烦呢。在
@RunWith
旁边需要一个空配置和
@ContextConfiguration
。总的来说,仅仅使用这个特性就太过分了,您可以使用一个简单的
新类路径资源(“export.xml”)。这是更快的,不依赖任何魔法。不知何故是真的。也许我会那样做。但这并不是你如何看待这个问题的答案。仅仅使用
@Value
来获取硬编码的资源就太过了(imho),而在单元测试中启用Spring(Boot)功能(这就不仅仅是一个单元测试!)就太过了。