どんな試験-イベントやクラスは、民法の分野にイギリスでデザインされイタリアの授業で

StackOverflow https://stackoverflow.com/questions/34571

  •  09-06-2019
  •  | 
  •  

質問

どんなユニットテスト(利用ル)クラスは内部民法の分野、また入れ子のクラス?また機能である、民間による 社内連携 (static C/C++のみ)における民間匿名)名前空間?

そうで悪のアクセス修飾子のための方法や機能だけで走行できるようにします。

役に立ちましたか?

解決

更新:

10年後その試験のための民間の方法、利用できな会員は @Jailbreak から マニホールド 枠組み

@Jailbreak Foo foo = new Foo();
// Direct, *type-safe* access to *all* foo's members
foo.privateMethod(x, y, z);
foo.privateField = value;

このようにコードは型保証されたすことはないですね。ないデザインを真摯に受けとめ、対応なoverexposing方法及び分野のテストを行っております。

ましてややレガシー Java 用のない方を変化させ視認性の方の民間試験方法が用 反射.

内部的にいえ用ヘルパーを取得および設定するための、 privateprivate static 変数などの呼び出し privateprivate static ます。には、次のようなパターンができるのかに関する民法の分野でもちろん、変更することができません private static final 変数を通して反射を生み出します。

Method method = TargetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);

および分野:

Field field = TargetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);

注記:
1. TargetClass.getDeclaredMethod(methodName, argClasses) きみ private ます。同じめに getDeclaredField.
2.の setAccessible(true) が必要で遊ぶprivates.

他のヒント

最良の方法を試し、民間法による方法です。できなかった場合は、次のいずれかの条件を満たすことがtrue:

  1. の方法では死者コード
  2. がデザイン香りが近く、クラスで試験
  3. の方法が主張しようとしている試験すべきでない個人

いただいた場合、民法のクラスが十分に複雑なことを感じる必要性試験の方法は、直接であるコードの臭い:私のクラスに感謝したいと思います。

私の通常のアプローチへの対応などの課題がじったり、新しいクラスが含まれる興味深いですね。しばしば、このメソッドの分野で相互作用する、ももう一つの方法は抽出できる新しいクラスです。

新しいクラスに挑むこれらの方法として"公共"というようにアクセスユニットテスト。新旧のクラスは現在も簡単にオリジナルのクラスでは、サマーフェスティバルにおいてじっくり楽しんでも、かん).

おんこの人の作教室を使用せずに脳!ここがポイント利用の力ユニットテストを探しをお手伝いしまします。

利用してい 反射 このためにはJavaは、私の意見で大きな間違いです。

厳密に言えば、 ない する文書のユニットテストを直接試験の民間。何 すべ する試験の公共契約のクラスはその他のオブジェクトアナフィラキシー様に直接試験は、オブジェクトの炉内構造物.が開発したいと思います小さな内部変更のクラスに影響しませんの授業を公開契約、その後は、変更の反映に基づく試験を確保することができる。そうすれば繰り返し通じて、プロジェクト単位で試験を停止している有用な測定コードの健康を阻害要因となり開発に迷惑をかける開発チームです。

私がお勧めではなく、を使用していますので、コードカバレッジツールなどのCoberturaこえるかもしれないが、このユニットテストを書きを良のコードを民間。そのように、間接的な試験かの方法にて、維持し、より高いレベルの機動的なものにす

この記事: 試験の民間法JUnitとSuiteRunner (Bill Venners)には、基本的に4つのオプション:

  • テストしていない個人ます。
  • を与える方法でパッケージです。
  • 使用入れ子の試験クラスです。
  • 使用している。

一般的には単体テストは行使する公開インタフェースのクラスまたはユニットです。そのため、民間の方法は実装の詳細となる試験を明確にした。

での事例を使いたいと思っている試験は、民間法

  1. 復号化ルーチン -い いうものではないものの見かた のための試験、他の誰でも 利用してメッセージを復号す.その 固有のコードでは、複雑な は、常に業務の明らかな例外は反射に使用できるビューでも個人法のほとんどの場合において、 SecurityManager 設定されていないの防止にあります。
  2. 作SDK 地域 消費量です。ここで公開するか 完全に異なる意味、この がコードすることが (な内部自分のとします。りたい コードを民間の方法ではない といったSDKユーザは見ない なとりましても、コードの匂いだけ どのグSDKです。もの コースだけをテストする必要があり私の privateメソッドは、彼が の機能のSDKを実際に ます。

かのえのみの試験の"契約".がんまでに提唱、実際には検査コードのマイレージは変更になる場合がございます。

私のトレードオフをより複雑にJUnits反射でなく、妥協することは私のセキュリティ&サポート。

の方法と呼ばれるメソッドは、publicメソッドは、インプット公開の方法も試験privateメソッドと呼ばれる方公共。がメソッドは、publicメソッドに失敗した場合、それが失敗の方法です。

もう一つのアプローチまたは民間の法パッケージプライベートあるいは保護された後に補完する @VisibleForTesting アノテーションのGoogleグァバの図書館があります。

そうしたものでこの方法を用いる注意点については、しないということでもパッケージです。またテストクラスに含める必要はありませんで同じパッケージ 物理的に, が同じパッケージに 試験 フォルダにまとめた。

例えば、方法で試験されるは src/main/java/mypackage/MyClass.java その後テストの呼び出され src/test/java/mypackage/MyClassTest.java.そのために、新しいアクセスの試験方法試験クラスです。

試験レガシーコードの大き、個性豊かなクラスでもできる試験は、民間や公共法を書い 権現.

を利用したい junitx.util.PrivateAccessor-パッケージJava.多くのホールワンライナーへのアクセス民法及び民間分野

import junitx.util.PrivateAccessor;

PrivateAccessor.setField(myObjectReference, "myCrucialButHardToReachPrivateField", myNewValue);
PrivateAccessor.invoke(myObjectReference, "privateMethodName", java.lang.Class[] parameterTypes, java.lang.Object[] args);

を試みたCem Catikkas' ソリューションを反映 Javaのいい言葉では言った、よりエレガントな解決方法によって説明します。しかし、少なくともこの場に代わるものを探している反射、アクセスにはソースだけの試験、こけます。

が可能なメリット試験privateメソッドのクラスは、特に テスト駆動開発, いいデザイン小さな試験だから任意のコードです。

組成のアクセス、個人会員の方法で試験分野のコードが困難な目標を具体的にはアクセスのみを公開。場合はメソッドは、publicメソッドは、複数の段階でできる複数の民法では、試験される。

メリット:

  • 試すことができめ細かな

デメリット:

  • 試験のコードに居住同 ファイルとしてのソースコードできる く維持
  • 同様に。クラスの出力ファイルのものでなければならないので同じパッケージとして宣言されたソースコード

ただし、継続的な試験が必要で、この方法で信号のprivateメソッドを抽出するには、この中で試験しなければならな史と伝統を大公開。

こちらは肥大化しどのようにこの仕事:

// Import statements and package declarations

public class ClassToTest
{
    private int decrement(int toDecrement) {
        toDecrement--;
        return toDecrement;
    }

    // Constructor and the rest of the class

    public static class StaticInnerTest extends TestCase
    {
        public StaticInnerTest(){
            super();
        }

        public void testDecrement(){
            int number = 10;
            ClassToTest toTest= new ClassToTest();
            int decremented = toTest.decrement(number);
            assertEquals(9, decremented);
        }

        public static void main(String[] args) {
            junit.textui.TestRunner.run(StaticInnerTest.class);
        }
    }
}

内部クラスを作成する ClassToTest$StaticInnerTest.

参照: Java先106:静内部クラスのための楽しさや利益

たのしいいわ---テストしていない民間の方法。ここにいくつかの例がありますの思い:

  1. いすべてのメソッドの小型、簡単に試験やすいものは何かが間違ってい)
  2. 使用コード-カバレッジツールです。私のように Cobertura (oh日のようにな新しいバージョンだけではない。)

をコード-カバレッジのユニット。する方法がないために追加の試験を取材。を目指す100%のコードカバレッジが実現するだろうと思っておきたいところです。

Privateメソッドを消費による公開した。その他、彼らは死者のコードです。だからこそ試験の公開方法の主張を期待される成果の公開方法及びこれにより、民間の方が消費する

試験の民間法のずれによるデバッグを前に実行ユニットの試験公開。

もデバッグ用テスト駆動開発のディバッグユニットテストまですべての主張される。

個人的であると考えてより良い創造を用いた授業TDD;の公開方法スタブ、その発生試験ユニット すべての の主張は、あらかじめ定義されてい期待される成果の方法を決定する前にコードです。このように、にんにくの間違ったパスの単体テストの主張に合わせます。クラスがその力強く要件を満たす場合全ての単位で試験ます。

Spring Framework テストできます。privateメソッドを使用方法:

ReflectionTestUtils.invokeMethod()

例えば:

ReflectionTestUtils.invokeMethod(TestClazz, "createTest", "input data");

を使用する場合は春 ReflectionTestUtils を提供す手軽なツールでちます。例えば、模擬ることなく、会員制の追加は望ましくない公開セッター:

ReflectionTestUtils.setField(theClass, "theUnsettableField", theMockObject);

ばね試験、既存のコードといった動きと重ね合わせ、反射する。

の場合はクラスのデザインがまだ柔軟なっている複雑な民の方法だ試験別途にもたらされたと考えられるこれを引き出すには別のクラスおよび試験スク以外のリスクにつきます。これは当てはまりませんの公開インタフェースのクラスできる社内のインスタンスを生成し、ヘルパークラスのヘルパーな方法です。

したい場合は試験の困難なエラー条件からヘルパーメソッドで行さい。エキスインターフェースのヘルパークラスは、追加公getterとsetterのクラスを注入し、ヘルパークラスにより使用するインターフェース)を注入し、模擬のヘルパークラスオリジナルのクラスのどのように、元のクラスに応答するから例外がスローされる場合をするヘルパーこのアプローチでもしたい場合は試験のクラスでもなく試験のヘルパークラスです。

試験の民間法の封止材用のクラスでは毎回変更の内部実装すクライアントコード(この場合)。

でテストしていない個人ます。

その答えら JUnit.org FAQページ:

がなければならな...

ご利用の場合はJDK1.3以上、利用できる反射を覆すような アクセス制御機構の支援の PrivilegedAccessor.詳細は使い方を指導することもでき、読む この記事.

ご利用の場合は、JDK1.6以上のご注釈を付けお試験 @試験に使用でき Dp4j 注入反射にテスト方法によるものです。のための 詳細は使い方を指導することもでき、 この試験スクリプト.

P.S.私の貢献 Dp4j, お願い あなたが必要です。:)

したい場合は民間試験方法において、エレガシィ用できな変化のコードは、オプションのためのJava jMockit, れが国際化することを可能とする疑似オブジェクトへのユーザーが外出中であっても、リニューアルグランドオープンのクラスです。

いないという傾向がある民間試験方法そこがない狂気。個人的には、ダウンロードいただけまうのみを試験公露出インタフェース(およびその保護および内部方法)。

使用している場合は、程度php,c#,dには、 junit-アドオン.する能力を無視するには、Javaセキュリティモデルとアクセスのprivateメソッドや属性です。

民間法をすることを目的とするもので、同じクラスです。があるのではなく、試験の"プライベート"の方法の対象からテストクラスです。これを行うことができ試験ユニットは手動で変更する方法から"個"と"保護".

そして保護された方法のみがアクセス可能で、同じパッケージのクラスが定義されています。なので、試験における保護法の対象クラスとして定義する試験クラスと同じパッケージ対象のクラスです。

すべてのない客様のご要求に使用 の反映方法 アクセスの方法。

私はあなたがリファクタリングのコードでチャレンジしましょう。る場合を考えていると反射はその他の種類のもの、テストコードで、何かがおかしいとのコードです。

また異なる種類の課題です。まず、民間分野場合には、民間分野において新たに追加しのコンストラクタおよび注入分野とのこと。の代わりにこの:

public class ClassToTest {

    private final String first = "first";
    private final List<String> second = new ArrayList<>();
    ...
}

いて使用す:

public class ClassToTest {

    private final String first;
    private final List<String> second;

    public ClassToTest() {
        this("first", new ArrayList<>());
    }

    public ClassToTest(final String first, final List<String> second) {
        this.first = first;
        this.second = second;
    }
    ...
}

このな問題であるもののレガシーコードです。古いコードを利用する空のコンストラクタまた,コードを整理し、見たクリーナー、ことができるでしょう注入に必要な価値試験なしです。

今や個人ます。私の個人的な体験できるスタブの民間試験法、その方法というクラスです。共通パターンを、その場合は、い 包む 内でのインタフェースのように、 Callable その後渡ししますのでそのインタフェースのコンストラクタ(複数のコンストラクタtrick):

public ClassToTest() {
    this(...);
}

public ClassToTest(final Callable<T> privateMethodLogic) {
    this.privateMethodLogic = privateMethodLogic;
}

ほぼすべてのことを書いてなっているように見えますが、依存関係の噴射パターンです。私の個人的な体験で有用な試験をしながら、このようなコードリーダーとすることによりナンス性の向上にも寄与します。いと思うん、入れ子のクラス.場合に入れ子のクラスを含む重論理にあたるようにしたほうがよいと思い移動してパッケージプライベートクラスとして注入するクラスを必要とします。

以外にもデザインパターンを利用していながらリファクタリングおよび維持のレガシーコードですべての異例のコードのテストです。反射主に問題ありませんが、できるし、企業のアプリケーションと重試験及び試験を実行する前に展開もの凄く遅い(かん、りんね(笑).

またセッター注入がない使用をお薦めします。今より良いってコンストラクタおよび全てを初期化する必要があり、可能性のための注入に必要な依存関係.

多く上が示唆されている、良い方法は試験によりそうした公開インタフェース

そうすれば、この利用コード-カバレッジツール(エマ)がprivateメソッドが実行されるから。

ここでは私の汎用機能試験、民間分野

protected <F> F getPrivateField(String fieldName, Object obj)
    throws NoSuchFieldException, IllegalAccessException {
    Field field =
        obj.getClass().getDeclaredField(fieldName);

    field.setAccessible(true);
    return (F)field.get(obj);
}

下記をご参照ください例

以上の書き:

import org.powermock.reflect.Whitebox;

今まで直通のオブジェクトは、民法、メソッド名と呼ばれるよう、追加のパラメータは以下のとおり。

Whitebox.invokeMethod(obj, "privateMethod", "param1");

今日は、押されたJavaアプリケーションを民間試験方法及びます。そのためにはAndroidを心が可能であり、これまでのようにも利用されることJavaプロジェクト.

また一部のコード専用方法や分野またはコンストラクタを使用でき BoundBox.などを探しています。ここではテストアクセスする二つの民間分野のAndroid活動を試験す:

@UiThreadTest
public void testCompute() {

    // Given
    boundBoxOfMainActivity = new BoundBoxOfMainActivity(getActivity());

    // When
    boundBoxOfMainActivity.boundBox_getButtonMain().performClick();

    // Then
    assertEquals("42", boundBoxOfMainActivity.boundBox_getTextViewMain().getText());
}

BoundBox この辺りの試験を個/保護分野、方法、コンストラクタ.もできるのでアクセスもに隠れたる継承関係を示します。実際、BoundBox改封止.までのアクセスすべてを通じて反射 すべてが確認でコンパイルす。

試験に最適です一部のレガシーコードです。使用します。;)

https://github.com/stephanenicolas/boundbox

まず、私はこの問題:なぜ個人員が必要な分離の実験をしていますか?いること、提供する、そのような複雑な行動を求める試験とは別に公表面?このユニット試験なラインのコードをテスト。な汗の小さなんですよ。

それに十分に大きいこれらの個人会員はそれぞれのユニットによる大量の複雑性--検討リファクタリングなどの個人会員の本クラスです。

場合のリファクタリングが不適切または困難でのご利用の戦略パターンの交換のアクセスはこれらの個人会員機能/加できるよう、下ユニットです。の下での単体テストまでの戦略提供する追加の検証がリリースを構築することは簡単なことでpassthrough.

っており、最近では、この問題を書いた少なツールと呼ばれる Picklock, とを回避の問題を明示的に使用のJava反射APIでは、二つの例:

メソッドを呼び出すたびに、例えば private void method(String s) -Javaによる反射

Method method = targetClass.getDeclaredMethod("method", String.class);
method.setAccessible(true);
return method.invoke(targetObject, "mystring");

メソッドを呼び出すたびに、例えば private void method(String s) よPicklock

interface Accessible {
  void method(String s);
}

...
Accessible a = ObjectAccess.unlock(targetObject).features(Accessible.class);
a.method("mystring");

設定などを private BigInteger amount; -Javaによる反射

Field field = targetClass.getDeclaredField("amount");
field.setAccessible(true);
field.set(object, BigInteger.valueOf(42));

設定などを private BigInteger amount; よPicklock

interface Accessible {
  void setAmount(BigInteger amount);
}

...
Accessible a = ObjectAccess.unlock(targetObject).features(Accessible.class);
a.setAmount(BigInteger.valueOf(42));

Javaい利用 反射, てんとうに変更するアクセスのパッケージに宣言されたメソッドのためのテストを実施する。しかし、いうのは試験の公開の手法も確保の方法に働きます。

使用できませんの反射を民間から外部のクラスのprivate修飾子反射の影響も

そうではないですね。でも確かでどのように Cem Catikkasの回答.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top