Azure-sdk-for-java: ИспользованиС ΠΌΠΎΠΊΠΎΠ² Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… тСстах

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 16 Π°Π²Π³. 2019  Β·  4ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: Azure/azure-sdk-for-java

Моки Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… тСстах

ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ тСсты Π½Π°Ρ†Π΅Π»Π΅Π½Ρ‹ Π½Π° тСстированиС Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ прСдсказуСмо Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ любоС количСство Ρ€Π°Π·, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Моки ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для ΠΎΠ±Ρ…ΠΎΠ΄Π° взаимодСйствия с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, выходящими Π·Π° Ρ€Π°ΠΌΠΊΠΈ Π²Π°ΡˆΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… тСстов. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° тСстировании ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π²Π°ΡˆΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… тСстов, ΠΈ Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ Π²Π½Π΅ΡˆΠ½ΠΈΡ… классах / Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… / зависимостях.

ΠŸΡ€ΠΈ этом ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ тСстируСмым Π±Π΅Π· использования ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Mockito, JMockit ΠΈ Ρ‚. Π”. «ПоддСлки, Π° Π½Π΅ MocksΒ». ΠŸΠΎΠ΄Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ - это просто Π·Π°ΠΌΠ΅Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½ΡƒΡŽ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ, ΠΏΠΎΠ΄Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ стандартныС ΠΎΡ‚Π²Π΅Ρ‚Ρ‹.

public interface ConfigurationService {
        Configuration readConfiguration(String configurationName);
}

public class AzureConfigurationService implements ConfigurationService {
    Configuration readConfiguration(String configurationName) {
        // read configuration from Azure configuration service
    }
}

public class MyApplication {
    private final ConfigurationService configurationService;
    public MyApplication(ConfigurationService configurationService) {
        this.configurationService = configurationService;
    }

    public String getConfigurationOwner () {
        Configuration configuration = configurationService.readConfiguration("configName");
        return configuration.getOwner();
    }
}


public class Test {
    <strong i="10">@Test</strong>
    public void testMyApplication() {
        // unit test won't work as it requires connection to azure services
        MyApplication myApplication = new MyApplication(new AzureConfigurationService()); 
        assertEquals("foo", myApplication.getConfigurationOwner());
    }
}

ВмСсто этого Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ввСсти ΠΏΠΎΠ΄Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ

public class FakeConfigurationService implements ConfigurationService {
    public Configuration readConfiguration(String configurationName) {
        Configuration configuration = new Configuration();
        configuration.setOwner("foo");
        return configuration;
    }
}

public class Test {
    <strong i="14">@Test</strong>
    public void testMyApplication() {
        // unit test will now work as the fake object requires no network connection
        MyApplication myApplication = new MyApplication(new FakeConfigurationService());
        assertEquals("foo", myApplication.getConfigurationOwner());
    }
}

Однако ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ быстрСС ΠΏΠΈΡΠ°Ρ‚ΡŒ тСсты. Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ для написания ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… тСстов Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Моки ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это быстрСС, позволяя ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π΅Π· написания большого количСства ΠΊΠΎΠ΄Π° для ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ зависимостСй.

Π₯ΠΎΡ€ΠΎΡˆΠΈΠ΅ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Ρ‹ Π½Π° использованиС ΠΌΠ°ΠΊΠ΅Ρ‚Π°:

  1. Зависимости, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ сСтСвого ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ - Π›ΡŽΠ±Ρ‹Π΅ зависимости, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ ΠΏΠΎ сСти, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ доступ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Π²Ρ‹Π·ΠΎΠ²Ρ‹ слуТб REST ΠΈ Ρ‚. Π”.
  2. Ѐайловая систСма - ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ / классы, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. К этому слСдуСт ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΊ зависимости, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅ΠΉ сСтСвого ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Рассмотрим случай, ΠΊΠΎΠ³Π΄Π° Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² NFS .
  3. ΠšΠ»Π°ΡΡΡ‹ сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ - ΠΏΠΎΠΈΠ·Π΄Π΅Π²Π°ΠΉΡ‚Π΅ΡΡŒ Π½Π°Π΄ Π½ΠΈΠΌΠΈ с ΡƒΠΌΠΎΠΌ . Π’Π°Ρˆ ΠΊΠΎΠ΄ зависит ΠΎΡ‚ этих Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ ΠΈΠ»ΠΈ сСтСвыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’ ΠΈΠ΄Π΅Π°Π»Π΅ Ρ‚Π°ΠΊΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² собствСнный интСрфСйс, Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ.
  4. ВСсты Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ - тСсты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π½Π° Π΄Π°Ρ‚Ρƒ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΄Π°Ρ‚Ρ‹ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ / ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ. НСкоторыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ выполнСния Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° часов с Ρ‚ΠΈΠΊΠ΅Ρ€Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ 100 Ρ‚Π°ΠΊΡ‚ΠΎΠ² часов Π·Π° сСкунду, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΌΡƒ тСсту Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 100 сСкунд.

НС смСйся

БтатичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ - Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ PowerMock, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π½ΠΎ Π·Π° это приходится ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ. Он Π²ΠΌΠ΅ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ Π² Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ классов ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСсогласованному повСдСнию Π² тСстах ΠΈ ​​рабочСй срСдС выполнСния. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· этих Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΌΠ΅ΡˆΠ°ΡŽΡ‚ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡŽ покрытия тСстами ΠΈ приводят ΠΊ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΌ ΠΎΡ‚Ρ‡Π΅Ρ‚Π°ΠΌ ΠΎ тСстовом ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ.

РСшСниС : Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄, сначала ΠΎΡ†Π΅Π½ΠΈΡ‚Π΅, Π΅ΡΡ‚ΡŒ Π»ΠΈ способ Ρ€Π΅ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ваш ΠΊΠΎΠ΄ ΠΈ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² статичСском ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅. Если это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ ΠΊ статичСскому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΠ² Π΅Π³ΠΎ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

public class ClassToTest {
    public String methodToTest() {
        String retVal = Util.notTestFriendlyStaticMethod();
        return process(retVal);
    }
}

ΠŸΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ

public class ClassToTest {
    private UtilWrapper utilWrapper;

    public ClassToTest(UtilWrapper utilWrapper) {
        this.utilWrapper = utilWrapper;
    }

    public String methodToTest() {
        String retVal = utilWrapper.callStaticUtilMethod();
        return process(retVal);
    }
}

public class Test {
    <strong i="10">@Test</strong>
    public void testMethod() {
        UtilWrapper utilWrapper = Mockito.mock(UtilWrapper.class);
        when(utilWrapper.callStaticUtilMethod()).thenReturn("ExpectedString");
        ClassToTest classToTest = new ClassToTest(utilWrapper);
        assertEquals("expectedstring", classToTest.methodToTest());
    }
}

Π˜Π·Π΄Π΅Π²Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ Π½Π°Π΄ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ классами

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Mockito, трСбуСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ настройка, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ классы final ΠΊΠ°ΠΊ описано Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Mockito 2 .

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ (Ссли Π½Π΅ всС) клиСнтскиС классы, прСдставлСнныС Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ SDK для Azure, - это final . Π­Ρ‚ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠ΅Ρ‚ΡŒ для связи со слуТбами Azure.

Как ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ клиСнтских Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Azure SDK, вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ зависит ΠΎΡ‚ стороннСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, которая выполняСт сСтСвыС Π²Ρ‹Π·ΠΎΠ²Ρ‹. Π’ Ρ‚Π°ΠΊΠΈΡ… сцСнариях для вашСго прилоТСния рСкомСндуСтся Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ зависимости ΠΈ ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π΅ Π·Π° своим собствСнным интСрфСйсом. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ зависимости Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйса, ΠΈ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ. Π­Ρ‚ΠΎ позволяСт Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ рСализациями интСрфСйса Π±Π΅Π· нСобходимости Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния Π² вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ прСимущСством являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ваши ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ тСсты ΠΌΠΎΠ³ΡƒΡ‚ Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Π²Π΅Ρ€Ρ…Ρƒ этой страницы, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΠ΅Ρ‚, Π½Π΅ трСбуя ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΡŽ классов final .

App Configuration Client

ВсС 4 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

@mssfang Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ? Π― Π²ΠΈΠ΄Π΅Π», ΠΊΠ°ΠΊ Π² тСстах AppConfiguration использовались ΠΌΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΈΠ· ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… ΠΌΠ½ΠΎΠΉ PR.

Бпасибо Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ. Π—Π°ΠΊΡ€ΠΎΠΉΡ‚Π΅ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ сСйчас.

ЧСстно говоря, я Π½Π΅ ΡƒΠ±Π΅ΠΆΠ΄Π΅Π½ Π² ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΊ ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅ классов SDK Azure с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ final ΠΈ прСдоставлСнии интСрфСйсов для этих классов. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ с поддСльной Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·, Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ SDK для Azure, Π½ΠΎ ΠΈ с Π»ΡŽΠ±Ρ‹ΠΌ сторонним SDK. Однако Π΅ΡΡ‚ΡŒ случаи, ΠΊΠΎΠ³Π΄Π° эта Ρ„Π°Π»ΡŒΡˆΠΈΠ²Π°Ρ рСализация (Π½Π΅ имитируСмая) рСализуСтся Π»ΠΈΠ±ΠΎ ΠΏΡƒΡ‚Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйса, Π»ΠΈΠ±ΠΎ ΠΏΡƒΡ‚Π΅ΠΌ пСрСопрСдСлСния клиСнтского класса, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π²Π°ΡˆΠ΅ΠΌΡƒ систСмному ΠΊΠΎΠ΄Ρƒ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, я ΠΌΠΎΠ³Ρƒ Π²Ρ‹ΡΠΌΠ΅ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ здСсь , Π½ΠΎ, чСстно говоря, я Π½Π΅ ΡΡ‡ΠΈΡ‚Π°ΡŽ цСлСсообразным Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ ΠΈΠ·Π΄Π΅Π²Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ, я скорСС Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽ клиСнтский интСрфСйс ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽ ΠΏΠΎΠ΄Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ AWS , Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠ·Π΄Π΅Π²Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° Π½Π΅ Π±Ρ‹Π»ΠΎ Ρ‚Π°ΠΌ дСлаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π°Π»ΡŒΡˆΠΈΠ²Π°Ρ рСализация.

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ @srnagar.

Допустим, я создал интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт слуТбы BLOB-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Azure Storage для всСго ΠΌΠΎΠ΅Π³ΠΎ прилоТСния.

ПослС создания этого интСрфСйса рСализуСтся рСализация, которая Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ слуТбы BLOB-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Azure для прСдоставлСния слуТбы хранСния.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ написан ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ тСстовый ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для этой ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ? Как Π²Ρ‹ сказали, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ классов azure java sdk ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ, ΠΊΠ°ΠΊ я ΠΌΠΎΠ³Ρƒ провСсти ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ΅ тСстированиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ этой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½Π΅ высмСивая Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ классы ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Π»ΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ интСрфСйс нСдоступСн.

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, проститС мСня, Ссли я Π½Π΅ Π½Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅. Π― всС Π΅Ρ‰Π΅ ΠΈΠ·ΡƒΡ‡Π°ΡŽ способы ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ написания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ