Junit単体テストの基本的な使い方と注意点
Junit 単体テストの基本的な使用法:
1. 実行するメソッドに @Test
の注釈を追加します。 2. 注釈はエラーを報告します。解決策は Ctrl+1 で junit を追加します
3. 実行するメソッドを選択し、右クリック --> junit テストとして実行
複数のメソッドを一度に実行: クラスを右クリックし、 --> Junit テストとして実行
Junit 単体テストに関する注意:
1. @Test を使用しないメソッドJunit を使用してアノテーションを実行することはできません
2.Junit で実行できるのは、実行修飾子が public で戻り値の型が void の空のパラメーター メソッドのみです
単体テストに関するアノテーション
@Test: 単体テスト、メソッドを実行できます別々に
@Before: 単体テストの前に実行できます @Test リソースを取得するために使用されます
@After: 単体テストの後に実行されます @Test は一部のリソースを使用するために使用できます
注: @Before と @After を別々に実行することはできません@Test を実行すると、それらは自動的に実行されます
JDK1.5 以降に提供されるアノテーション
@Deprecated: 廃止されたことを意味します
@Deprecated: は、廃止されたクラスを表すようにクラスを変更するために使用でき、また、廃止されたことを表すようにメソッドを変更するために使用することもできますメソッド
廃止されたクラスやメソッドも使用できますが、欠陥がある可能性があるため推奨されません。または、より良いメソッドに置き換えられます
JDK1.5 以降に提供されるアノテーション
@Override: メソッドがオーバーライドであるかどうかをテストするために使用されるメソッドです
JDK1 .5では、@Overrideはクラス継承クラスによってオーバーライドされたメソッドのみを検出できます
JDK1.6以降では、@Overrideはクラス継承とクラス書き換えのメソッドとクラス実装インターフェースの書き換えのメソッドの両方を検出できます
JDK1以降に提供されたアノテーション.5
@SuppressWarnings: 警告の抑制 (警告の表示を防ぐ) を示します
@SuppressWarnings: 使用する場合は、どの警告を抑制するかを明確にする必要があります
@SuppressWarnings (パラメーター): パラメーターは文字列配列です
パラメータを 1 つだけ記述する場合は、{} を無視できます。複数のパラメータがある場合は、複数のパラメータの間に {} を使用する必要があります。
String[] a = {"ac","ds"}
警告が発生する可能性があります。抑制されるのは次のとおりです:
rawtypes、タイプセーフティを無視する
チェックなし、安全性チェックを無視する
未使用、無視する未使用
非推奨、廃止を無視する
null 空のポインタを無視する
Serial はシリアル番号を無視する
all はすべて無視する
注釈の範囲: クラスで定義できます。メソッド、コード
同じアノテーションは、同じ場所で 1 回だけ使用できます
カスタム アノテーション: キーワード @interface
を使用してクラスを定義します: class
インターフェイスを定義します: インターフェイス
列挙型を定義します: enum (削除)
アノテーションを定義します: @interface
アノテーションの形式を定義します:
修飾子 @interface アノテーション名 {
アノテーションの属性 (存在するかどうか)
属性を含むアノテーションの定義:
属性は、クラスのメンバー変数およびメンバー メソッドと同等です
属性の定義形式:
修飾子の戻り値の型(データ型) 属性名() [デフォルトの属性値]
修飾子: 固定形式(同様のインターフェース) public abstract 書くかどうかに関わらず、拡張読み込み行を記述することを推奨します
戻り値の型: Basicデータ型 (4カテゴリ8種類) 文字列型 クラス型列挙アノテーション 上記型の1次元配列
[デフォルトの属性値]:[ ] オプションの属性にはデフォルト値を与えるか与えないか可能
int a = 10; ;
1 public @interface MyAnnotation02 { 2 //基本数据类型(4类8种) 3 public abstract int a() default 10; 4 //String类型 5 public abstract String s(); 6 //Class类型 7 public abstract Class clazz(); 8 //枚举 9 public abstract Color c();10 //注解11 public abstract MyAnnotation01 myanno01();12 //以上类型的一维数组13 public abstract String[] arr();14 }15 16 enum Color{17 GREEN,18 RED19 /*20 * public static final Color GREEN = new Color();21 * public static final Color RED = new Color();22 */23 }
属性を含むアノテーションを定義します
このアノテーションには属性が 1 つだけあります
元アノテーション: カスタム アノテーションを変更するために使用される JDK によって提供されるアノテーションです
@Retention は宣言期間を決定するために使用されます。
Retention アノテーションの属性は列挙型 RetentionPolicy です (列挙型には SOURCE、CLASS、RUNTIME の 3 つの属性があります)
機能: アノテーション タイプのアノテーションを保持する期間を示します
Retention アノテーションがない場合アノテーション タイプ宣言では、保持ポリシーのデフォルトは RetentionPolicy.CLASS です。
RetentionPolicy.SOURCE 変更されたアノテーションは、バイトコード クラスではなく、ソース コードにのみ存在できます。目的: コンパイラに提供されます。
RetentionPolicy.CLASS で変更されたアノテーションは、ランタイム メモリではなく、ソース コードとバイトコードにのみ存在できます。目的: JVM Java 仮想マシンは
RetentionPolicy.RUNTIME を使用します。変更されたアノテーションはソース コード、バイトコード、およびメモリ (ランタイム) に存在します。目的: XML 設定を置き換えます
@Target は、変更されたカスタム アノテーションの使用場所を決定するために使用されます
Target アノテーションの属性は列挙型 ElementType (一般的に使用される属性 TYPE、CONSTRUCTOR....) です
機能: 適用可能なアノテーションを示しますtype プログラム要素のタイプ。
アノテーション型宣言に Target メタアノテーションが存在しない場合、宣言された型は任意のプログラム要素で使用できます。
ElementType.TYPE 変更されたクラス、インターフェース
ElementType.CONSTRUCTOR 変更された構造体
ElementType.METHOD 変更されたメソッド
ElementType.FIELD 変更されたフィールド
1 @Retention(RetentionPolicy.RUNTIME)2 @Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})3 public @interface MyAnnotation03 {4 public abstract int value();5 }
使用自定义注解:
格式:@自定义注解的名字(属性名= 属性值 ,属性名=属性值)
注意:
1.自定义注解没有属性,可以直接使用-->@自定义注解的名字
2.自定义注解有属性 使用的时候 必须使用键值对的方式 给所有属性赋值 才能使用 有默认值的属性可以不用赋值
3.如果注释的属性是一个数组 赋值的时候只有一个值可以省略{} 赋值多个必须写出{}
4.注解的使用范围 可以用来修饰类 方法 构造方法 变量
5.使用自定义注解 如果只有一个属性 名字叫value 赋值的时候value可以省略不写
6.一个对象上(修饰类, 方法,构造方法,变量)注解只能使用一次 不能重复使用
自定义注解的解析:使用自定义注解 获取自定义注解的属性值
和解析有关的接口:
java.lang.reflect.AnnotatedElement接口
所有已知实现类:AccessibleObject Class Constructor Field Method Package
接口中的方法:
boolean isAnnotationPresent(Class annotationClass)
如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
判断(Constructor, Field, Method...)有没有指定的注解
参数:注解的class文件对象,可以传递MyAnnotation03.class(String.class,int.class)
T getAnnotation(Class
如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
获取(Constructor, Field, Method...)上的注解,参数传递的是哪个注解的class文件对象,就获取哪个注解
参数:注解的class文件对象,可以传递MyAnnotation03.class
使用步骤:
1.定义一个方法,使用自定义注解
2.使用反射技术获取本类的class文件对象
3.使用反射技术获取类中所有的方法
4.遍历包含所有方法的数组,获取每一个方法
5.使用isAnnotationPresent判断该方法上是否包含传递参数的注解
6.如果方法上包含注解,使用getAnnotation获取方法上的注解
7.使用属性的名字,获取属性值
1 public class UseMyAnnotation02 { 2 //1.定义一个方法,使用自定义注解 3 @MyAnnotation03(value=10) 4 public void method(){ 5 6 } 7 8 @Test 9 public void test(){10 //2.使用反射技术获取本类的class文件对象11 Class clazz = UseMyAnnotation02.class;12 //3.使用反射技术获取类中所有的方法13 Method[] methods = clazz.getMethods();14 //4.遍历包含所有方法的数组,获取每一个方法15 for (Method method : methods) {16 String methodName = method.getName();17 //5.使用isAnnotationPresent判断该方法上是否包含传递参数的注解18 boolean b = method.isAnnotationPresent(MyAnnotation03.class);19 if(b){20 System.out.println(methodName+":"+b);21 //6.如果方法上包含注解,使用getAnnotation获取方法上的注解22 MyAnnotation03 myAnno = method.getAnnotation(MyAnnotation03.class);23 //7.使用属性的名字,获取属性值24 int v = myAnno.value();25 System.out.println(v);26 }27 }28 }29 }
类加载器:把class文件加载到内存中 并生成一个class文件对象
加载器的组成:
Bootstrap ClassLoader 引导(根)类加载器
也被称为引导类加载器 负责java核心类的加载
Extension ClassLoader 扩展类加载器
负责人JRE的扩展目录中的jar包的加载
在JDK中JRE的lib目录下井ext目录
AppClassLoader 应用类加载器
负责在JVM启动时加载来自java命令的class文件 以及classpath环境变量
所指定的jar包和类路径
自定义的类型Person; commons-io-2.4.jar
类加载器的继承关系:
AppClassLoader extends ExtClassLoader extends Bootstrap ClassLoader extends ClassLoader
和类加载器有关的方法:
Class类中的方法:
ClassLoader getClassLoader() 返回该类的类加载器。
ClassLoader类中的方法:
ClassLoader getParent() 返回委托的父类加载器。
1 public class DemoClassLoader { 2 @Test 3 public void show01(){ 4 //获取应用类加载器 5 ClassLoader loader = DemoClassLoader.class.getClassLoader(); 6 System.out.println(loader);//sun.misc.Launcher$AppClassLoader@5fcf29 7 8 loader = loader.getParent(); 9 System.out.println(loader);//sun.misc.Launcher$ExtClassLoader@5fcf2910 11 loader = loader.getParent();12 System.out.println(loader);//根类加载器由c/c++编写,没有相关的类描述,返回null13 }14 15 @Test16 public void app(){17 //获取应用类加载器18 ClassLoader loader = DemoClassLoader.class.getClassLoader();19 System.out.println(loader);//sun.misc.Launcher$AppClassLoader@5fcf2920 }21 22 @Test23 public void ext(){24 //获取扩展类加载器25 /*26 * 扩展包中的类,不支持使用27 * 想使用必须设置访问权限28 * sun/**29 */30 ClassLoader loader = SunEC.class.getClassLoader();31 System.out.println(loader);//sun.misc.Launcher$ExtClassLoader@19b1de32 }33 34 @Test35 public void boot(){36 ClassLoader loader = String.class.getClassLoader();37 System.out.println(loader);//null38 }39 }
JDK动态代理:只能代理接口
java.util.collections集合的工具类
Collections集合的工具类的静态方法
static
返回指定列表的不可修改视图
传递一个List集合返回一个被代理的List集合
unmodifiableList方法就是一个代理方法,代理List集合
如果调用size get方法 没有对集合进行修改 则允许执行
如果调用add remove set 对集合进行了修改,则抛出异常不让方法执行
会抛出UnsupportedOperationException:不支持操作异常
1 public class Demo01Proxy { 2 @Test 3 public void show(){ 4 List<String> list = new ArrayList<String>(); 5 list.add("a"); 6 list.add("b"); 7 8 //调用Collections中的方法unmodifiableList 9 list = Collections.unmodifiableList(list);10 String s = list.get(0);11 System.out.println(s);12 13 System.out.println(list.size());14 15 //list.add("c");16 //list.remove(0);17 }18 }
创建接口InvocationHandler的实现类
重写接口中的方法invoke 对集合的方法进行判断
如果调用size get方法 没有对集合进行修改 则允许执行
如果调用add remove set 对集合进行了修改 则抛出异常不让方法执行
Object invoke(Object proxy,Method method,Object[] args)在代理实例上处理方法调用并返回结果
参数:
Object proxy:内部会使用反射创建一个代理人对象,和我们无关
Method method:内部会使用反射获取到执行List集合的方法(size,get,....)
Object[] args:内部会使用反射获取到调用集合方法的参数
返回值:
Object:调用List集合的方法的返回值
注意事项:
代理的是List集合,必须把被代理的集合传递到实现类中,为了保证代理的始终是同一个List集合
在成员位置创建一个List集合
使用带参数构造给集合赋值
1 public class InvocationHandlerImpl implements InvocationHandler{ 2 private List<String> list; public InvocationHandlerImpl(List<String> list) { 5 this.list = list; 6 } 7 8 @Override 9 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {10 //获取方法的名字11 String mehtodName = method.getName();12 //对方法的名字进行判断,如果是add,remove,set就抛出异常13 if("add".equals(mehtodName)){14 throw new UnsupportedOperationException("add no run");15 } if("remove".equals(mehtodName)){18 throw new UnsupportedOperationException("remove no run");19 } if("set".equals(mehtodName)){22 throw new UnsupportedOperationException("set no run");23 } //如果是size,get执行方法25 Object obj = method.invoke(list, args);26 return obj;27 } }
1 /* 2 * 动态代理综合案例: 3 * 需求: 4 * 模拟Collections.unmodifiableList(list); 5 * 传递List,返回List 6 * 调用List方法的时候,通过我的代理类中的方法 invoke, 7 * 如果调用size,get方法,没有对集合进行修改,则允许执行 8 * 如果调用add,remove,set,对集合进行了修改,则抛出异常不让方法执行 9 * 会抛出UnsupportedOperationException:不支持操作异常10 * 实现步骤:11 * 1.模拟unmodifiableList方法,定义一个代理的方法proxyList,参数传递List集合,返回被代理后的List集合12 * 2.在proxyList方法内部实现动态代理13 * java.lang.reflect.Proxy:提供了和动态代理有关的方法14 * static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 15 * 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。 16 * 参数:17 * ClassLoader loader:传递类加载器,加载类到内存中,创建class文件对象;可以传递本类的类加载器18 * Class<?>[] interfaces:传递ArrayList实现的接口List/Collection的Class文件对象19 * InvocationHandler h:创建一个InvocationHandler的实现类,重写接口中的方法invoke,对集合的方法进行判断20 * 如果调用size,get方法,没有对集合进行修改,则允许执行21 * 如果调用add,remove,set,对集合进行了修改,则抛出异常不让方法执行22 * 返回值类型:23 * Object:返回被代理后的List集合24 */25 @SuppressWarnings("all")26 public class Demo02Proxy {27 /*28 * 1.模拟unmodifiableList方法,定义一个代理的方法proxyList,参数传递List集合,返回被代理后的List集合29 */30 public static List<String> proxyList(List<String> list){31 //2.在proxyList方法内部实现动态代理,调用Proxy类中的方法newProxyInstance32 List<String> proxyList = (List<String>) Proxy.newProxyInstance(Demo02Proxy.class.getClassLoader(),33 list.getClass().getInterfaces(), new InvocationHandlerImpl(list));34 return proxyList;35 } /* * 1.模拟unmodifiableList方法,定义一个代理的方法proxyList,参数传递List集合,返回被代理后的List集合39 */40 public static List<String> proxyList02(final List<String> list){41 //2.在proxyList方法内部实现动态代理,调用Proxy类中的方法newProxyInstance42 List<String> proxyList = (List<String>) Proxy.newProxyInstance(Demo02Proxy.class.getClassLoader(),43 list.getClass().getInterfaces(), new InvocationHandler() {44 @Override45 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {46 //获取方法的名字47 String mehtodName = method.getName();48 //对方法的名字进行判断,如果是add,remove,set就抛出异常49 if("add".equals(mehtodName)){50 throw new UnsupportedOperationException("add no run");51 }52 53 if("remove".equals(mehtodName)){54 throw new UnsupportedOperationException("remove no run");55 } if("set".equals(mehtodName)){58 throw new UnsupportedOperationException("set no run");59 }60 //如果是size,get执行方法61 Object obj = method.invoke(list, args);62 return obj;63 }64 });65 return proxyList;66 }67 68 @Test69 public void test(){70 List<String> list = new ArrayList<String>();71 list.add("a");72 list.add("b");73 //调用代理方法proxyList传递list集合74 //list = Collections.unmodifiableList(list);75 list = Demo02Proxy.proxyList(list);76 System.out.println(list.size());77 System.out.println(list.get(0));78 //list.add("c");//UnsupportedOperationException:add no run79 //list.remove(0);//UnsupportedOperationException:remove no run80 list.set(0, "c");//UnsupportedOperationException:set no run81 }82 }
以上がJunit単体テストの基本的な使い方と注意点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









仮想マシンを作成するときに、ディスクの種類を選択するように求められます。固定ディスクまたはダイナミック ディスクを選択できます。固定ディスクを選択した後でダイナミック ディスクが必要であることに気付いた場合、またはその逆の場合はどうすればよいでしょうか? いいですね!一方をもう一方に変換できます。この記事では、VirtualBox 固定ディスクをダイナミック ディスクに、またはその逆に変換する方法を説明します。ダイナミック ディスクは、最初は小さいサイズですが、仮想マシンにデータを保存するにつれてサイズが大きくなる仮想ハード ディスクです。ダイナミック ディスクは、必要なだけのホスト ストレージ スペースのみを使用するため、ストレージ スペースを節約するのに非常に効率的です。ただし、ディスク容量が増加すると、コンピュータのパフォーマンスがわずかに影響を受ける可能性があります。仮想マシンでは固定ディスクとダイナミック ディスクが一般的に使用されます

Windows 11 でダイナミック ディスクをベーシック ディスクに変換する場合は、プロセスによってその中のすべてのデータが消去されるため、最初にバックアップを作成する必要があります。 Windows 11 でダイナミック ディスクをベーシック ディスクに変換する必要があるのはなぜですか? Microsoft によると、ダイナミック ディスクは Windows から廃止され、その使用は推奨されなくなりました。さらに、Windows Home Edition はダイナミック ディスクをサポートしていないため、これらの論理ドライブにアクセスできません。より多くのディスクを結合してより大きなボリュームを作成する場合は、ベーシック ディスクまたは記憶域スペースを使用することをお勧めします。この記事では、Windows 11 でダイナミック ディスクをベーシック ディスクに変換する方法を説明します。 Windows 11 でダイナミック ディスクをベーシック ディスクに変換するにはどうすればよいですか?初めに
![Illustrator でのプラグインの読み込みエラー [修正]](https://img.php.cn/upload/article/000/465/014/170831522770626.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Adobe Illustrator を起動すると、プラグインの読み込みエラーに関するメッセージが表示されますか?一部の Illustrator ユーザーは、アプリケーションを開いたときにこのエラーに遭遇しました。メッセージの後には、問題のあるプラグインのリストが続きます。このエラー メッセージは、インストールされているプラグインに問題があることを示していますが、Visual C++ DLL ファイルの破損や環境設定ファイルの破損など、他の理由によって発生する可能性もあります。このエラーが発生した場合は、この記事で問題を解決する方法を説明しますので、以下を読み続けてください。 Illustrator でのプラグインの読み込みエラー Adobe Illustrator を起動しようとしたときに「プラグインの読み込みエラー」エラー メッセージが表示された場合は、次の操作を行うことができます。 管理者として

Windows PC の Stremio で字幕が機能しませんか?一部の Stremio ユーザーは、ビデオに字幕が表示されないと報告しました。多くのユーザーが、「字幕の読み込みエラー」というエラー メッセージが表示されたと報告しています。このエラーとともに表示される完全なエラー メッセージは次のとおりです: 字幕の読み込み中にエラーが発生しました 字幕の読み込みに失敗しました: これは、使用しているプラグインまたはネットワークに問題がある可能性があります。エラー メッセージにあるように、インターネット接続がエラーの原因である可能性があります。したがって、ネットワーク接続を確認し、インターネットが適切に機能していることを確認してください。これとは別に、このエラーの背後には、競合する字幕アドオン、特定のビデオ コンテンツでサポートされていない字幕、古い Stremio アプリなど、他の理由が考えられます。のように

JUnit フレームワークのアノテーションは、テスト メソッドの宣言と構成に使用されます。主なアノテーションには、@Test (テスト メソッドの宣言)、@Before (テスト メソッドの実行前に実行されるメソッド)、@After (テスト メソッドの後に実行されるメソッド) があります。が実行される)、@ BeforeClass (すべてのテスト メソッドが実行される前に実行されるメソッド)、@AfterClass (すべてのテスト メソッドが実行された後に実行されるメソッド)、これらのアノテーションは、テスト コードを整理して簡素化し、テスト コードの信頼性を向上させるのに役立ちます。明確な意図と構成を提供することで、読みやすさと保守性を向上させます。

はじめに: PHPDoc は、理解しやすく有益なドキュメントを作成する PHP コードのコメント標準です。 PHPDoc では、特定のコメント タグを使用することで、開発者が関数、クラス、メソッド、その他のコード要素に関する重要な詳細を提供できるようになります。この高度なガイドでは、PHPDoc を詳しく説明し、その機能を実証し、効果的な文書化戦略を提供します。構文とタグ: PHPDoc コメントは二重スラッシュ (//) または複数行コメント (/**/) で始まります。一般的なアノテーション タグをいくつか示します。 @param: 関数またはメソッドのパラメータを定義します。 @return: 関数またはメソッドの戻り値を指定します。 @throws: 関数またはメソッドによってスローされる可能性のある例外について説明します。 @var: クラスの属性またはインスタンスを定義します

インターネットの発展に伴い、スクロール読み込みをサポートする必要がある Web ページが増えています。無限スクロール読み込みもその 1 つです。これにより、ページに新しいコンテンツを継続的に読み込むことができるため、ユーザーはよりスムーズに Web を閲覧できるようになります。この記事では、PHPを使って無限スクロールローディングを実装する方法を紹介します。 1. 無限スクロールローディングとは何ですか?無限スクロール読み込みは、スクロール バーに基づいて Web コンテンツを読み込む方法です。その原理は、ユーザーがページの一番下までスクロールすると、AJAX を通じてバックグラウンド データが非同期的に取得され、新しいコンテンツが継続的に読み込まれることです。このような積み込み方法

Outlook にハイパーリンクを挿入するときにフリーズの問題が発生した場合は、不安定なネットワーク接続、古い Outlook バージョン、ウイルス対策ソフトウェアによる干渉、またはアドインの競合が原因である可能性があります。これらの要因により、Outlook がハイパーリンク操作を適切に処理できない可能性があります。ハイパーリンクの挿入時に Outlook がフリーズする問題を修正する 次の修正プログラムを使用して、ハイパーリンクの挿入時に Outlook がフリーズする問題を修正します。 インストールされているアドインを確認する Outlook を更新する ウイルス対策ソフトウェアを一時的に無効にして、新しいユーザー プロファイルの作成を試行する Office アプリ プログラムを修正する Office をアンインストールして再インストールする 始めましょう。 1] インストールされているアドインを確認する Outlook にインストールされているアドインが問題の原因となっている可能性があります。
