6.1 స్టాటిక్ పద్ధతిని వెక్కిరించడం mockStatic()

మరియు స్టాటిక్ పద్ధతుల యొక్క వెక్కిరింపు మరియు ధృవీకరణ మరొక ముఖ్యమైన విషయం. "దానిలో తప్పు ఏమిటి?" మీరు అడగండి. అవును, స్టాటిక్, కానీ పద్ధతులు ఒకే విధంగా ఉంటాయి. మరియు మీరు తప్పు అవుతారు.

మాక్ వస్తువుల గురించి మనం ఎక్కడ నేర్చుకోవడం ప్రారంభించామో గుర్తుందా? ఈ వస్తువులు ద్వారా కృత్రిమంగా సృష్టించబడినందున DynamicProxy. మరియు స్టాటిక్ పద్ధతులు ఏ వస్తువులకు కట్టుబడి ఉండవు మరియు వాటి ద్వారా కాల్‌లను అడ్డగించడం DynamicProxyఅసాధ్యం . అంతే.

కానీ మోకిటో యొక్క సృష్టికర్తలు ఇక్కడ కూడా తప్పించుకోగలిగారు - వారు వారి స్వంత క్లాస్ లోడర్‌ను వ్రాసారు మరియు దాని సహాయంతో వారు ఫ్లైలో తరగతులను భర్తీ చేయగలిగారు. పెద్ద మరియు కష్టమైన పని, కానీ వారు ఇప్పటికీ దీన్ని చేయగలిగారు.

మీరు దీనికి అదనపు లైబ్రరీని జోడించాలి pom.xml:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>4.2.0</version>
    <scope>test</scope>
</dependency>

మీరు స్టాటిక్ పద్ధతిని అపహాస్యం చేయవలసి వస్తే ఎలా పని చేయాలో ఇక్కడ ఉంది.

1 ప్రత్యేక మాక్ క్లాస్ ఆబ్జెక్ట్‌ని సృష్టించండి:

MockedStatic<ClassName>managerObject = Mockito.mockStatic(ClassName.class);

2 ఈ వస్తువుకు ఆపరేషన్ నియమాలను జోడించండి:

నియమం యొక్క ఈ వస్తువుకు ఇతర మార్గాల్లో అతుక్కోవడం అవసరం.

managerObject.when(ClassName::method name).thenReturn(result);

3 ఈ వస్తువు యొక్క ఉపయోగాన్ని వ్రాప్ చేయాలనిtry-with-resources నిర్ధారించుకోండి , తద్వారా ఆబ్జెక్ట్ వెంటనే తొలగించబడుతుంది మరియు మోకిటో దానితో అనుబంధించబడిన నియమాలను క్లియర్ చేయగలదు.

ఉదాహరణ:

@Test
void givenStaticMethodWithNoArgs () {
    try (MockedStatic< StaticUtils> utilities =  Mockito.mockStatic( StaticUtils.class)) {
        // add rule
         utilities.when(StaticUtils::name).thenReturn("Hello");

        // check if the rule works
        assertEquals("Hello", StaticUtils.name());
    }
}

ఉల్లేఖనాల వలె అందంగా లేదు @Mockమరియు @Spy, కానీ చాలా ఆచరణాత్మకమైనది. పరీక్షలో ఉన్న పద్ధతుల్లో ఉపయోగించే సాధారణ స్టాటిక్ పద్ధతిని అపహాస్యం చేయడం అసాధ్యం అయినప్పుడు పరీక్షలు రాయడం చాలా కష్టం.