Junit&反射

本文详细介绍JUnit测试框架的使用,包括注解如@Test、@Before和@After的作用;同时深入探讨Java反射机制,涵盖Class类、Constructor构造方法、Field字段及Method方法等核心概念,并讲解如何通过不同方式获取字节码对象。
1.junit
   @表示注解
   Test表示要被测试的代码
   Before表示测试前要执行的内容
   After表示测试后要执行的内容


2.类的加载
    类的加载(初始化)时机?
 1、创建对象时
 2、使用类中的静态成员
 3、反射
 4、如果创建了子类对象,父类也会加载
 5、使用命令: java XXX 时,这个类也会进内存


3.反射
      Class 类
 Constructor 构造方法
 Field 字段
 Method 方法


   3.1、字节码对象的三种获取方式:
        1. Class的forName方法:       Class.forName("类的全名");
   2. 具体类的class属性:         String.class
   3. 具体类对象的getClass方法:  String s = "abc";      s.getClass();


3.2、获取构造方法:
   a.获取空参
b.获取有参
c.获取无参的快速写法
d.暴力反射获取私有构造
3.3、获取方法:
   a. 1.用字节码对象clazz.getMethod(方法名,...方法参数列表);
  2.执行方法  invoke(对象名,参数值);
b.执行main方法:
     参数是一维数组:
     a.直接把一维数组转成Object
 b.把一维数组作为新数组的元素
3.4、获取字段:
   a. 1.用字节码对象clazz.getField(字段名);
      2.field.get(对象名)  field.set(对象名,参数);
   4、Class<T>
此处的T就是一个变量,在运行时,接受具体类型。例如:User变量必须先定义再使用
泛型变量的定义方式:修饰符<变量名>返回值
    
package com.taobao.dba.amp.util; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockedStatic; import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; import org.slf4j.Logger; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.verify; @RunWith(MockitoJUnitRunner.class) @MockitoSettings(strictness = Strictness.LENIENT) public class TaeUtilsMockTest { // @Test // public void testDecrypt_logsOnException() throws Exception { // Field logField = TaeUtils.class.getDeclaredField("log"); // logField.setAccessible(true); // try { // Field modifiersField = Field.class.getDeclaredField("modifiers"); // modifiersField.setAccessible(true); // modifiersField.setInt(logField, logField.getModifiers() & ~Modifier.FINAL); // } catch (NoSuchFieldException ignore) { // // } // Logger mockLogger = mock(Logger.class); // logField.set(null, mockLogger); // byte[] badContent = new byte[]{0x00, 0x01, 0x02}; // data that will cause decrypt to fail // String password = "some-password"; // byte[] result = TaeUtils.decrypt(badContent, password); // assertNull(result); // verify(mockLogger, atLeastOnce()).error(anyString(), any(Throwable.class)); // } @Test public void testEncryptString_logsOnException() throws Exception { Field logField = TaeUtils.class.getDeclaredField("log"); logField.setAccessible(true); Field modifiers = Field.class.getDeclaredField("modifiers"); modifiers.setAccessible(true); modifiers.setInt(logField, logField.getModifiers() & ~Modifier.FINAL); Logger mockLogger = mock(Logger.class); logField.set(null, mockLogger); try (MockedStatic<TaeUtils> mocked = mockStatic(TaeUtils.class, org.mockito.Mockito.CALLS_REAL_METHODS)) { mocked.when(() -> TaeUtils.encrypt("hello", "pwd")) .thenThrow(new Exception("simulated encrypt failure")); String res = TaeUtils.encryptString("hello", "pwd"); verify(mockLogger, atLeastOnce()).error(anyString(), any(Throwable.class)); } } @Test public void testDecryptString_logsOnException() throws Exception { Field logField = TaeUtils.class.getDeclaredField("log"); logField.setAccessible(true); try { Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(logField, logField.getModifiers() & ~Modifier.FINAL); } catch (NoSuchFieldException ignore) { } Logger mockLogger = mock(Logger.class); logField.set(null, mockLogger); String hexInput = "00"; byte[] decryptFrom = TaeUtils.parseHexStr2Byte(hexInput); String password = "pwd-for-test"; try (MockedStatic<TaeUtils> mocked = mockStatic(TaeUtils.class, org.mockito.Mockito.CALLS_REAL_METHODS)) { mocked.when(() -> TaeUtils.parseHexStr2Byte(hexInput)).thenReturn(decryptFrom); mocked.when(() -> TaeUtils.decrypt(decryptFrom, password)) .thenThrow(new RuntimeException("simulated decrypt failure")); String res = TaeUtils.decryptString(hexInput, password); assertNull(res); verify(mockLogger, atLeastOnce()).error(anyString(), any(Throwable.class)); } } } 报错org.mockito.exceptions.misusing.UnnecessaryStubbingException: Unnecessary stubbings detected in test class: TaeUtilsMockTest Clean & maintainable test code requires zero unnecessary code. Following stubbings are unnecessary (click to navigate to relevant line of code): 1. -> at com.taobao.dba.amp.util.TaeUtils.decrypt(TaeUtils.java:52) Please remove unnecessary stubbings or use 'lenient' strictness. More info: javadoc for UnnecessaryStubbingException class. at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:53) at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163) at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283) at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128) at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203) at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)如何解决
最新发布
12-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值