java - Populating SpringValue أثناء اختبار الوحدة




junit spring-annotations (4)

إذا كان ذلك ممكنًا ، سأحاول كتابة هذا الاختبار بدون Spring Context. إذا قمت بإنشاء هذا الفصل الدراسي في الاختبار الخاص بك دون فصل الربيع ، فستكون لديك السيطرة الكاملة على حقوله.

لتعيين الحقل @value يمكنك استخدام Spring ReflectionTestUtils - وهي تحتوي على طريقة setField لتعيين الحقول الخاصة.

see JavaDoc: ReflectionTestUtils.setField (java.lang.Object، java.lang.String، java.lang.Object)

أحاول كتابة اختبار وحدة لحبة بسيطة تستخدم في برنامجي للتحقق من صحة النماذج. يتم وضع @Component الفاصوليا مع @Component ولديها متغير فئة تتم تهيئته باستخدام @Value("${this.property.value}") private String thisProperty;

أود أن أكتب اختبارات الوحدة لطرق التحقق من الصحة داخل هذا الصف ، ولكن إذا كان ذلك ممكنا ، أود أن أفعل ذلك دون استخدام ملف الخصائص. السبب وراء هذا ، هو أنه إذا تغيرت القيمة التي أقوم بها من ملف الخصائص ، أود أن لا يؤثر ذلك على حالة الاختبار الخاصة بي. تقوم حالة الاختبار الخاصة بي باختبار الرمز الذي يقوم بالتحقق من صحة القيمة وليس القيمة نفسها.

هل هناك طريقة لاستخدام شفرة Java داخل فئة الاختبار الخاصة بي لتهيئة فئة Java وملء خاصية SpringValue داخل هذا الصف ثم استخدم ذلك للاختبار؟

لقد وجدت هذا كيف يبدو أن وثيقة ، ولكن لا يزال يستخدم ملف خصائص. أفضل أن يكون كل رمز جافا.

شكر


إذا كنت ترغب في ذلك ، فلا يزال بإمكانك تشغيل الاختبارات في سياق Spring وتعيين الخصائص المطلوبة داخل فئة تكوين فصل الربيع. إذا كنت تستخدم JUnit ، فاستخدم SpringJUnit4ClassRunner وحدد فئة التهيئة المخصصة للاختبارات الخاصة بك مثل:

الصف قيد الاختبار:

@Component
public SomeClass {

    @Autowired
    private SomeDependency someDependency;

    @Value("${someProperty}")
    private String someProperty;
}

فئة الاختبار:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = SomeClassTestsConfig.class)
public class SomeClassTests {

    @Autowired
    private SomeClass someClass;

    @Autowired
    private SomeDependency someDependency;

    @Before
    public void setup() {
       Mockito.reset(someDependency);

    @Test
    public void someTest() { ... }
}

وفئة التكوين لهذا الاختبار:

@Configuration
public class SomeClassTestsConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer properties() throws Exception {
        final PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
        Properties properties = new Properties();

        properties.setProperty("someProperty", "testValue");

        pspc.setProperties(properties);
        return pspc;
    }
    @Bean
    public SomeClass getSomeClass() {
        return new SomeClass();
    }

    @Bean
    public SomeDependency getSomeDependency() {
        // Mockito used here for mocking dependency
        return Mockito.mock(SomeDependency.class);
    }
}

بعد أن قلت ، لا أوصي بهذا النهج ، لقد أضفته هنا للرجوع إليه. في رأيي أفضل طريقة هي استخدام عداء Mockito. في هذه الحالة ، لا تجري اختبارات داخل Spring على الإطلاق ، وهو أمر أكثر وضوحًا وبساطة.


منذ ربيع 4.1 ، يمكنك إعداد قيم الخصائص في التعليمات البرمجية فقط باستخدام التعليق التوضيحي لـ org.springframework.test.context.TestPropertySource على مستوى فئة اختبارات الوحدات. يمكنك استخدام هذا الأسلوب حتى لحقن الخصائص في حالات الفول المعتمدة

فمثلا

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = FooTest.Config.class)
@TestPropertySource(properties = {
    "some.bar.value=testValue",
})
public class FooTest {

  @Value("${some.bar.value}")
  String bar;

  @Test
  public void testValueSetup() {
    assertEquals("testValue", bar);
  }


  @Configuration
  static class Config {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertiesResolver() {
        return new PropertySourcesPlaceholderConfigurer();
    }

  }

}

ملاحظة: من الضروري الحصول على مثال org.springframework.context.support.PropertySourcesPlaceholderConfigurer في سياق الربيع

تحرير 24-08-2017: إذا كنت تستخدم @SpringBootTest @SpringBootConfiguration 1.4.0 وما بعده ، فيمكنك تهيئة الاختبارات باستخدام @SpringBootConfiguration والتعليقات التوضيحية لـ @SpringBootConfiguration . مزيد من المعلومات here

في حالة SpringBoot لدينا التعليمات البرمجية التالية

@SpringBootTest
@SpringBootConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = {
    "some.bar.value=testValue",
})
public class FooTest {

  @Value("${some.bar.value}")
  String bar;

  @Test
  public void testValueSetup() {
    assertEquals("testValue", bar);
  }

}

يبدو أن هذا يعمل ، على الرغم من أنه لا يزال مطولًا بعض الشيء (أحتاج إلى شيء أقصر حتى الآن):

@BeforeClass
public static void beforeClass() {
    System.setProperty("some.property", "<value>");
}

// Optionally:
@AfterClass
public static void afterClass() {
    System.clearProperty("some.property");
}






spring-annotations