孝械屑邪 褉械褎谢械泻褋懈懈 屑芯卸械褌 锌芯泻邪蟹邪褌褜褋褟 褋谢芯卸薪芯泄, 薪芯 芯斜褖械械 锌褉械写褋褌邪胁谢械薪懈械 芯 薪械泄 懈屑械褌褜 薪褍卸薪芯, 褌.泻. 薪邪 褝褌芯屑 褋褌褉芯懈褌褋褟 斜芯谢褜褕邪褟 褔邪褋褌褜 褎褉械泄屑胁芯褉泻芯胁 (胁泻谢褞褔邪褟 JUnit).
袪械褎谢械泻褋懈褟 - API, 锌芯蟹胁芯谢褟褞褖懈褏 邪薪邪谢懈蟹懈褉芯胁邪褌褜 锌褉懈谢芯卸械薪懈械 胁 屑芯屑械薪褌 懈褋锌芯谢薪械薪懈褟.
袪械褎谢械泻褋懈褟 薪邪褔懈薪邪械褌褋褟 褋 褌芯谐芯, 褔褌芯 褍 薪邪褋 械褋褌褜 泻谢邪褋褋, 泻芯褌芯褉褘泄 薪邪蟹褘胁邪械褌褋褟 Class.
袨斜褗械泻褌褘 褝褌芯谐芯 泻谢邪褋褋邪 芯锌懈褋褘胁邪褞褌 泻谢邪褋褋褘, 蟹邪谐褉褍卸械薪薪褘械 胁 锌邪屑褟褌褜 JVM.
袧邪锌褉懈屑械褉, 褍 胁邪褋 械褋褌褜 泻谢邪褋褋 Product. 袣芯谐写邪 JVM 蟹邪谐褉褍卸邪械褌 褝褌芯褌 泻谢邪褋褋 懈蟹 斜邪泄褌-泻芯写邪, 褌芯 芯薪邪 褋芯蟹写邪褢褌 芯斜褗械泻褌 泻谢邪褋褋邪 Class, 泻芯褌芯褉褘泄 懈 芯锌懈褋褘胁邪械褌 泻谢邪褋褋 Product.
效褌芯 蟹薪邪褔懈褌 芯锌懈褋褘胁邪械褌? 协褌芯 蟹薪邪褔懈褌 褋屑芯褌褉懈褌 薪邪 薪械谐芯 锌褉懈屑械褉薪芯 泻邪泻 屑褘 褋 胁邪屑懈:
- 袧邪蟹胁邪薪懈械
- 袧邪斜芯褉 锌芯谢械泄
- 袧邪斜芯褉 屑械褌芯写芯胁
- 懈 褌.写.
袣邪卸写褘泄 芯斜褗械泻褌 蟹薪邪械褌, 泻 泻邪泻芯屑褍 泻谢邪褋褋褍 芯薪 锌褉懈薪邪写谢械卸懈褌. 袣芯谐写邪 IDEA 谐械薪械褉懈褉褍械褌 equals 胁芯褌 褝褌邪 褋褌褉芯泻邪 懈 锌褉芯胁械褉褟械褌, 褔褌芯 芯斜褗械泻褌 芯褌薪芯褋褟褌褋褟 泻 芯写薪芯屑褍 懈 褌芯屑褍 卸械 泻谢邪褋褋褍: if (o == null || getClass() != o.getClass()) return false;.
袟邪褔械屑 褝褌芯 薪褍卸薪芯? 袪械褎谢械泻褋懈褟 锌芯蟹胁芯谢褟械褌 薪邪屑 斜褍泻胁邪谢褜薪芯 胁 褑懈泻谢械 锌械褉械斜懈褉邪褌褜 锌芯谢褟 懈 屑械褌芯写褘, 胁褘锌芯谢薪褟褟 薪械芯斜褏芯写懈屑褘械 写械泄褋褌胁懈褟:
- JUnit 褋屑芯褌褉懈褌, 薪邪锌懈褋邪薪芯 谢懈 薪邪写 屑械褌芯写芯屑
@Test - Mockito 褋屑芯褌褉懈褌, 薪邪锌懈褋邪薪芯 谢懈 薪邪写 锌芯谢械屑
@Mock,@InjectMocks - 懈 褌.写.
袠 褋邪屑芯械 谐谢邪胁薪芯械 - 斜谢邪谐芯写邪褉褟 褉械褎谢械泻褋懈懈 JUnit, Mockito 懈 写褉褍谐懈械 懈薪褋褌褉褍屑械薪褌褘 屑芯谐褍褌 褋芯蟹写邪胁邪褌褜 芯斜褗械泻褌褘 锌褉褟屑芯 胁芯 胁褉械屑褟 懈褋锌芯谢薪械薪懈褟 锌褉芯谐褉邪屑屑褘.
协褌芯 褔邪褋褌褜 "锌褉芯写胁懈薪褍褌邪褟", 薪懈褔械谐芯 褋褌褉邪褕薪芯谐芯, 械褋谢懈 胁褘 械褢 芯锌褍褋褌懈褌械 懈谢懈 芯褋褌邪胁懈褌械 写芯 谢褍褔褕懈褏 胁褉械屑褢薪. 袨薪邪 薪械 褟胁谢褟械褌褋褟 泻褉懈褌懈褔薪芯泄 懈 薪械芯斜褏芯写懈屑芯泄 写谢褟 锌芯薪懈屑邪薪懈褟 芯褋褌邪谢褜薪芯泄 褔邪褋褌懈 泻褍褉褋邪 懈 薪邪锌懈褋邪薪邪 褌芯谢褜泻芯 写谢褟 褌芯谐芯, 褔褌芯斜褘 懈薪褌械褉械褋褍褞褖懈械褋褟 屑芯谐谢懈 锌芯谢褍褔懈褌褜 斜邪蟹芯胁褍褞 懈薪褎芯褉屑邪褑懈褞.
袠褌邪泻 蟹邪写邪褔邪: 屑褘 褏芯褌懈屑 薪邪锌懈褋邪褌褜 薪械泻芯褌芯褉褍褞 锌邪褉芯写懈褞 薪邪 JUnit, 泻芯褌芯褉邪褟:
- 袘械褉褢褌 泻谢邪褋褋
- 袗薪邪谢懈蟹懈褉褍械褌 胁褋械 械谐芯 屑械褌芯写褘
- 袧邪褏芯写懈褌 胁褋械, 薪邪写 泻芯褌芯褉褘屑懈 褋褌芯懈褌 邪薪薪芯褌邪褑懈褟
@Test - 小芯蟹写邪褢褌 写谢褟 泻邪卸写芯谐芯 褌邪泻芯谐芯 屑械褌芯写邪 薪芯胁褘泄 芯斜褗械泻褌 懈 蟹邪锌褍褋泻邪械褌 薪邪 薪褢屑 褝褌芯褌 屑械褌芯写 (褌芯褌, 薪邪写 泻芯褌芯褉褘屑 褋褌芯褟谢芯
@Test)
袝褋褌械褋褌胁械薪薪芯, 屑褘 写谢褟 锌褉芯褋褌芯褌褘 懈蟹谢芯卸械薪懈褟 芯锌褍褋褌懈屑 泻褍褔褍 薪褞邪薪褋芯胁 懈 锌褉芯写械屑芯薪褋褌褉懈褉褍械屑 芯褋薪芯胁薪褍褞 懈写械褞. 袝褋谢懈 胁邪屑 斜褍写褍褌 懈薪褌械褉械褋薪褘 写械褌邪谢懈, 锌懈褕懈褌械 胁 Slack-褔邪褌 胁芯锌褉芯褋褘, 屑褘 芯斜褟蟹邪褌械谢褜薪芯 芯褌胁械褌懈屑.
袠褌邪泻, 锌芯械褏邪谢懈 (薪邪褕 锌芯写芯锌褘褌薪褘泄)*:
package ru.netology;
import org.junit.jupiter.api.Test;
public class DemoTest {
@Test
public void shouldBeCalled() {
System.out.println("Test method called");
}
public void shouldNotBeCalled() {
System.out.println("Invalid method called");
}
}袩褉懈屑械褔邪薪懈械*: 褑械谢懈泻芯屑 泻芯写 锌褉芯械泻褌邪 胁褘 屑芯卸械褌械 薪邪泄褌懈 胁 褉械锌芯蟹懈褌芯褉懈懈 褋 泻芯写芯屑 泻 谢械泻褑懈褟屑 胁 锌褉芯械泻褌械 reflection-sample.
小芯蟹写邪褢屑 "蟹邪锌褍褋泻邪谢泻褍" 薪邪褕懈褏 褌械褋褌芯胁:
package ru.netology;
import org.junit.jupiter.api.Test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Launcher {
// 褔褌芯 褌邪泻芯械 懈褋泻谢褞褔械薪懈褟 屑褘 褉邪蟹斜械褉褢屑 薪邪 褋谢械写褍褞褖械泄 谢械泻褑懈懈
public static void main(String[] args) throws IllegalAccessException, InstantiationException, InvocationTargetException {
// 褋芯蟹写邪褢屑 芯斜褗械泻褌 褌懈锌邪 `Class` (generic'懈 屑褘 锌芯泻邪 薪械 蟹薪邪械屑, 锌芯褝褌芯屑褍 懈 褌邪泻 "褋芯泄写褢褌")
// clazz 懈谢懈 cls - 芯斜褖械锌褉懈薪褟褌芯械 懈屑褟, 褌.泻. class - 蟹邪褉械蟹械褉胁懈褉芯胁邪薪芯
Class clazz = DemoTest.class;
// 斜械褉褢屑 胁褋械 屑械褌芯写褘 泻谢邪褋褋邪
Method[] methods = clazz.getDeclaredMethods();
// 锌械褉械斜懈褉邪械屑 屑械褌芯写褘
for (Method method : methods) {
// 褋屑芯褌褉懈屑, 械褋褌褜 谢懈 薪邪写 屑械褌芯写芯屑 邪薪薪芯褌邪褑懈褟 @Test
if (method.isAnnotationPresent(Test.class)) {
// 褋芯蟹写邪褢屑 芯斜褗械泻褌 泻谢邪褋褋邪 (newInstance 锌芯屑械褔械薪 邪薪薪芯褌邪褑懈械泄 @Deprecated, 薪芯 写谢褟 锌褉芯褋褌芯褌褘 屑褘 斜褍写械屑 懈褋锌芯谢褜蟹芯胁邪褌褜 械谐芯, 胁 锌褉芯褌懈胁薪芯屑 褋谢褍褔邪械, 薪褍卸薪芯 胁褘斜懈褉邪褌褜 泻芯薪褋褌褉褍泻褌芯褉褘)
Object object = clazz.newInstance();
// 胁褘蟹褘胁邪械屑 屑械褌芯写 薪邪 芯斜褗械泻褌械
method.invoke(object);
}
}
}
}袣邪泻 胁褘 胁懈写懈褌械, 泻芯写 "薪械 芯褋芯斜芯 锌褉懈褟褌薪褘泄", 懈, 胁 斜芯谢褜褕懈薪褋褌胁械 褋谢褍褔邪械胁, 胁褘 褌邪泻芯泄 泻芯写 锌懈褋邪褌褜 薪械 斜褍写械褌械, 械褋谢懈 薪械 褋褌邪薪械褌械 褋邪屑懈 褉邪蟹褉邪斜邪褌褘胁邪褌褜 斜懈斜谢懈芯褌械泻懈 懈 懈薪褋褌褉褍屑械薪褌褘 (褌.泻. 懈薪褋褌褉褍屑械薪褌褘 褌械褋褌懈褉芯胁邪薪懈褟 褍卸械 褝褌芯 写械谢邪褞褌 蟹邪 胁邪褋).
袧芯 褋胁芯褞 褉邪斜芯褌褍 芯薪 胁褘锌芯谢薪褟械褌, 胁褘 屑芯卸械褌械 蟹邪锌褍褋褌懈褌褜, 锌芯写械斜邪卸懈褌褜, 锌芯褋屑芯褌褉械褌褜, 泻邪泻 芯薪 褉邪斜芯褌邪械褌.
袣谢褞褔械胁芯械: 胁褘 写芯谢卸薪褘 锌芯薪懈屑邪褌褜, 褔褌芯 Java 锌褉械写芯褋褌邪胁谢褟械褌 薪邪屑 懈薪褋褌褉褍屑械薪褌褘 屑邪薪懈锌褍谢懈褉芯胁邪薪懈褟 泻芯写芯屑, 泻芯褌芯褉褘械 懈 锌芯蟹胁芯谢褟褞褌 褋芯蟹写邪胁邪褌褜 褌邪泻懈械 屑芯褖薪褘械 胁械褖懈 泻邪泻 JUnit 懈 Mockito*.
袩褉懈屑械褔邪薪懈械*: 薪邪 褋邪屑芯屑 写械谢械 屑褘 薪械屑薪芯谐芯 谢褍泻邪胁懈屑, 褌.泻. Mockito 懈褋锌芯谢褜蟹褍械褌 械褖褢 懈 斜懈斜谢懈芯褌械泻褍 ByteBuddy, 泻芯褌芯褉邪褟 谐械薪械褉懈褉褍械褌 斜邪泄褌-泻芯写 薪邪 谢械褌褍 (薪芯 褝褌芯 褍卸械 褋芯胁褋械屑 写褉褍谐邪褟 懈褋褌芯褉懈褟).