如何在Mockito中模拟Spring中的自动assembly的@Value字段?
我使用Spring 3.1.4.RELEASE和Mockito 1.9.5。 在我的Spring类中,我有:
@Value("#{myProps['default.url']}") private String defaultUrl; @Value("#{myProps['default.password']}") private String defaultrPassword; // ...
从我目前设置的JUnittesting中,
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({ "classpath:test-context.xml" }) public class MyTest {
我想为我的“defaultUrl”字段嘲笑一个值。 请注意,我不想模拟其他字段的值 – 我想保留它们,只有“defaultUrl”字段。 另外请注意,在我的类中没有明确的“setter”方法(例如setDefaultUrl
),我不想为了testing目的而创build任何方法。
鉴于此,我怎样才能嘲笑这个领域的价值呢?
您可以使用Spring的ReflectionTestUtils.setField
的魔术,以避免对代码做任何修改。
查看本教程以获取更多信息,尽pipe您可能不需要它,因为该方法非常易于使用
UPDATE
自引入Spring 4.2.RC1以来,现在可以设置一个静态字段而不必提供类的实例。 看到这部分的文档和这个提交。
现在是我第三次把自己search到这个SO职位,因为我总是忘记如何嘲笑@Value领域。 虽然接受的答案是正确的,但是我总是需要一些时间才能让“setField”调用正确,所以至less我自己在这里粘贴了一个示例代码片段:
鉴于:
@Value("#{myProps['default.url']}") private String defaultUrl;
在testing方法(在这里完整的名称):
org.springframework.test.util.ReflectionTestUtils.setField( myClassUnderTest, "defaultUrl", "url123"); // Note: Don't use MyClassUnderTest.class // Note: Don't use the referenced string "#{myProps['default.url']}", // but simply the field name "defaultUrl"
你也可以把你的属性configuration模拟到你的testing类中
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({ "classpath:test-context.xml" }) public class MyTest { @Configuration public static class MockConfig{ @Bean public Properties myProps(){ Properties properties = new Properties(); properties.setProperty("default.url", "myUrl"); properties.setProperty("property.value2", "value2"); return properties; } } @Value("#{myProps['default.url']}") private String defaultUrl; @Test public void testValue(){ Assert.assertEquals("myUrl", defaultUrl); } }