final修飾子のClassのprivateのコンストラクタをカバレッジ100%にする方法

final修飾子のClassのprivateなコンストラクタを呼び出す方法。
単体テストで使う用。

Java SE 1.8
Eclipse4.4
JUnit4
jmockit 1.43

コンストラクタの呼び出し

テスト対象のクラス

package privateConstructor;

private class privateConstructor_1 {

    private privateConstructor_1(){
        System.out.println("コンストラクタ");
    }
}

テストコード

package privateField;

import java.lang.reflect.Field;

import org.junit.Test;

public class privateConstructor_1_Test {

    @Test
    public void test() {
        Class<PrivateConstructor_1> targetClass=PrivateConstructor_1.class;
        Constructor<PrivateConstructor_1> targetConstructor=(Constructor<PrivateConstructor_1>) targetClass.getDeclaredConstructor();
        targetConstructor.setAccessible(true);
        PrivateConstructor_3 refrectedClass=targetConstructor.newInstance();
    }
}

実行結果

コンストラクタ

privateフィールドの呼び出し

privateなコンストラクタを持つfinal修飾子のClassのフィールドを呼び出す方法 テスト対象のクラス

package privateConstructor;

public class privateConstructor_1 {

    public privateConstructor_1(){
        System.out.println("コンストラクタ");
    }

    private int privateField1=0;
}

テストコード

package privateField;

import java.lang.reflect.Field;

import org.junit.Test;

public class privateConstructor_1_Test {

    @Test
    public void test() {
        Class<PrivateConstructor_1> targetClass=PrivateConstructor_1.class;
        Constructor<PrivateConstructor_1> targetConstructor=(Constructor<PrivateConstructor_1>) targetClass.getDeclaredConstructor();
        targetConstructor.setAccessible(true);

        Field targetField=targetClass.getDeclaredField("privateField1");
        targetField.setAccessible(true);

        PrivateConstructor_3 refrectedClass=targetConstructor.newInstance();
        System.out.println(targetField.get(refrectedClass));
    }
}

実行結果

コンストラクタ
0

備忘録として残してます。

【自分用】privateフィールドの書き換え・参照

privateなフィールドを書き換えたり取得したりする方法。
単体テストで使う用。

Java SE 1.8
Eclipse4.4
JUnit4

privateフィールドへの代入

テスト対象のクラス

package privateField;

public class privateField_1 {

    public privateField_1(){
        System.out.println("コンストラクタ");
    }

    private String _value_1="test";

    //setter
    public void setValue_1(String value){
        this._value_1=value;
    }

    //getter
    public String getValue_1(){
        return this._value_1;
    }
}

テストコード

package privateField;

import java.lang.reflect.Field;

import org.junit.Test;

public class privateField_1_Test {

    @Test
    public void checkField() {
        privateField_1 targetClass=new privateField_1();
        try{
            Field reflectedField=(Field) reflectPrivateField(targetClass,"_value_1");
            System.out.println("result:"+reflectedField.get(targetClass));
        }
        catch(Exception e){
            System.out.println("error:"+e);
        }
    }

    @Test
    public void checkSetMethod() {
        privateField_1 targetClass=new privateField_1();
        targetClass.setValue_1("checkSetMethod");
        try{
            System.out.println("result:"+(String)getPrivateField(targetClass,"_value_1"));
        }
        catch(Exception e){
            System.out.println("error:"+e);
        }
    }

    @Test
    public void checkGetMethod() {
        privateField_1 targetClass=new privateField_1();
        try{
            setPrivateField(targetClass, "_value_1", "checkGetMethod");
            System.out.println("result:"+targetClass.getValue_1());
        }
        catch(Exception e){
            System.out.println("error:"+e);
        }

    }

    //privateなフィールドを参照する
    private Object reflectPrivateField(Object targetClass,String fieldName)throws Exception{
        Class<?> reflectedClass =targetClass.getClass();
        Field targetField=reflectedClass.getDeclaredField(fieldName);
        targetField.setAccessible(true);
        return targetField;
    }

    //privateなフィールドの値を取得する
    private Object getPrivateField(Object targetClass,String fieldName)throws Exception{
        Class<?> reflectedClass =targetClass.getClass();
        Field targetField=reflectedClass.getDeclaredField(fieldName);
        targetField.setAccessible(true);
        return targetField.get(targetClass);
    }

    //privateなフィールドに値を書き換える
    private void setPrivateField(Object targetClass,String fieldName,Object value)throws Exception{
        Class<?> reflectedClass =targetClass.getClass();
        Field targetField=reflectedClass.getDeclaredField(fieldName);
        targetField.setAccessible(true);
        targetField.set(targetClass, value);
    }
}

実行結果

コンストラクタ
result:checkSetMethod
コンストラクタ
result:checkGetMethod
コンストラクタ
result:test

備忘録として残してます。

【自分用】Junitでのテスト方法

備忘録として残してます

Eclipse4.4
JUnit4
//テスト対象のクラス
public class Sample1 {

    public int publicVariable;
    private int privateVariable;

    //デフォルトコンストラクタ
    public Sample1(){
        this.publicVariable=1;
        this.privateVariable=2;
    }

    //引数ありコンストラクタ
    public Sample1(int a,int b){
        this.publicVariable=a;
        this.privateVariable=b;
    }

    //publicなメソッド
    public int publicMethod(){
        return publicVariable+privateVariable;
    }

    //privateなメソッド
    private int privateMethod(){
        return publicVariable*10+privateVariable;
    }

    //publicな引数ありメソッド
    public int publicMethodWithArgument(int c,int d){
        return c+d;
    }

    //privateな引数ありメソッド
    private int privateMethodWithArgument(int c,int d){
        return c*10+d;
    }
}

テストコード

//テストコード
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;


public class Sample1Test {


    private Sample1 targetClass=new Sample1();

    //testで呼んだメソッドの戻り値
    private int testResult;

    @BeforeClass
    public static void init(){
        System.out.println("テスト開始\n");
    }

    @AfterClass
    public static void exit(){
        System.out.println("テスト終了");
    }

    @Before
    public void setup(){
        System.out.println("テストケースごとに開始前に呼ばれます");
        testResult=0;
    }
    @After
    public void end(){
        System.out.println("テストケースごとに開始後に呼ばれます");
        System.out.println("----------\n");
        testResult=0;
    }

    @Test
    public void test1() {

        testResult=targetClass.publicMethod();
        System.out.println("test1の結果 : "+testResult);

    }

    @Test
    public void test2(){

        try{
            //privateメソッドにアクセスできるようにする
            Method targetMethod=Sample1.class.getDeclaredMethod("privateMethod");
            targetMethod.setAccessible(true);

            testResult=(int)targetMethod.invoke(targetClass);
        }
        catch(NoSuchMethodException e){
            System.out.println(e.toString());
        }
        catch(InvocationTargetException e){
            System.out.println(e.toString());
        }
        catch(IllegalAccessException e){
            System.out.println(e.toString());
        }

        System.out.println("test2の結果 : "+testResult);
    }

    @Test
    public void test3(){

        testResult=targetClass.publicMethodWithArgument(4,5);
        System.out.println("test3の結果 : "+testResult);
    }

    @Test
    public void test4(){

        try{
            //privateメソッドにアクセスできるようにする
            Method targetMethod=Sample1.class.getDeclaredMethod("privateMethodWithArgument",int.class,int.class);
            targetMethod.setAccessible(true);

            testResult=(int)targetMethod.invoke(targetClass,4,5);
        }
        catch(NoSuchMethodException e){
            System.out.println(e.toString());
        }
        catch(InvocationTargetException e){
            System.out.println(e.toString());
        }
        catch(IllegalAccessException e){
            System.out.println(e.toString());
        }

        System.out.println("test4の結果 : "+testResult);
    }
}

実行結果

テスト開始

テストケースごとに開始前に呼ばれます
test1の結果 : 3
テストケースごとに開始後に呼ばれます
----------

テストケースごとに開始前に呼ばれます
test2の結果 : 12
テストケースごとに開始後に呼ばれます
----------

テストケースごとに開始前に呼ばれます
test3の結果 : 9
テストケースごとに開始後に呼ばれます
----------

テストケースごとに開始前に呼ばれます
test4の結果 : 45
テストケースごとに開始後に呼ばれます
----------

テスト終了

Warframe 立ちっぱなしXakuビルド ソロ用

今回紹介するのはグリニア鋼耐久向けXakuビルド。

特徴としてはできるだけ「動かない」「武器で攻撃しない」こと。

f:id:Pootaro_no_Bibouroku:20220105155012j:plain

 

目次

ビルドの紹介

f:id:Pootaro_no_Bibouroku:20220105155957p:plain

フォーマ:5 Umbraフォーマ:1

エクシラスアダプター:有 オロキンリアクター:有

 

使用するModについて

  • オーラMod

正直何でもよい。自分はできるだけエネルギーオーブを取得しに行きたくない(動きたくない)ため、Energy Siphonを採用。

 

  • Umbral Intensify

Overextendedで下がった威力をMod1枚でデメリットなく上げることができるため採用。

 

  • Umbral Fiber & Umbral Vitality

4番 The Vast Untime使用時の回避率が75%とはいえ、敵レベルが高くなると当たった時のダメージも大きくなるため採用。また、Umbral Intensifyの威力を上げることもできる。

 

  • Overextended & Stretch & Auger Reach

範囲マジ大事。近づいてくる敵はプレイヤーから半径25m付近で射撃を始め20mくらいで一度止まるため、被弾回避&敵殲滅速度の向上には2番 Grasp of Lohkは範囲20m以上が欲しい。となると範囲はこの3枚を採用するしかなかった。

 

  • Vampiric Grasp

回避率75%とはいえダメージは受けるので、受けたダメージを動かずとも回復させるために採用。

 

  • The Relentless Lost

最初はThe Relentless Lostを使わず威力200%を目指したものの

  1. Overextendedの威力低下もありその他のModでは枠が圧迫される
  2. 威力はそこまでなくとも装甲値さえ0にしてしまえばダメージはそこそこ入る

これらを理由に採用。

 

  • Primed Sure Footed

あると強くなるというわけではないが、対アコライト&ヘビーガンナー&スコーピオンに対してストレスが軽減されるため採用。

 

Mod枠の関係上(Primed)Flowは使えず、エネルギー不足解消のため採用。もう一枠は自由。自分はアルケインガーディアンをよく使っている。

 

使用するアビリティについて

  • 1番 RESONATOR(Helminth移植) 

被弾軽減&集敵用アビリティ。Helminthで移植されたOctaviaの2番アビリティ。RESONATORの効果範囲に入った敵は攻撃を中断しRESONATORを追いかけるようになる。Gara 3番 Spectrorageでも似たことができるが、Spectrorageがダメージを受けると効果時間内でも効果が切れてしまうため、効果時間まで働いてくれるRESONATORを選んだ。

  • 2番 Grasp of Lohk

敵殲滅&回復用アビリティ。効果範囲内の敵の武器を盗み、盗んだ武器が自動で敵を攻撃する。2番増強 Vampiric Graspによって敵に対して1発当たり25ヘルス回復できるため、切断や火炎などの状態異常や敵レベルがあまりに高くならない限り倒されることはない。

  • 3番 The Lost(Gaze)

敵装甲値剥がし用アビリティ。敵1体を捕らえ、その敵を中心とした効果範囲内にいる敵のシールドかアーマーを、防衛低下の割合分減少させる。 威力200%以上で敵装甲値を100%除去する。このためUmbral FiberとUmbral Vitalityを両方抜いてしまうと3番増強 The Relentless Lost込みでも200%に届かなくなってしまう。

  • 4番 The Vast Untime

時間延長&被弾軽減用アビリティ。発動中は回避率が75%となりその他のアビリティ(RESONATORは除く)の効果時間を一時停止させる。このアビリティのおかげで効果時間と効率をある程度無視できる。

使用方法

  1. 敵を倒しつつエネルギーオーブやZenurikのEnergizing Dashでエネルギーを溜める。
  2. 4番 The Vast Untimeを発動し回避率を上げる。
  3. 3番 The LostのAccuse / Gaze / Denyをサイクルしながらアビリティ威力を+105%する。
  4. アビリティ威力が+105%になった時点で3番 The LostのGazeで敵装甲を100%剥がす。
  5. 2番 Grasp of Lohkを発動し、その後4番 The Vast Untimeも発動させる。
  6. 4番 The Vast Untimeの効果時間終了間際に再度発動させる。以下 6. のループ。

 

このビルドの注意点

  • 4番 The Vast Untimeには発動開始モーションに0.4秒かかるためどうしても2番 Grasp of Lohkと3番 The Lostの効果時間は切れてしまう。そのため2番 Grasp of Lohkと3番 The Lostは適時再発動が必要。
  • 3番増強 The Relentless Lostの影響で装甲100%剥がしまでに時間がかかる。
  • (Primed)Flowを使わないため、エネルギーリーチエクシマスに弱い。
  • 対アコライト対策をしていないためアコライトにめちゃくちゃ弱い。

まとめ

4番 The Vast Untime発動中はアビリティ効果時間が一時停止するというなかなか面白いフレームであり、範囲内の敵の装甲値を100%剥がすことのできる貴重なフレームなため、何とかめんどくさがりな自分に合ったビルドができないかと考え試した結果行き着いたのがこのビルド。グリニア高レベルミッションだけでなく、コーパスや感染体相手でも比較的楽にミッションをこなせるため、最近ではよく使うようになった。

今回初めてビルドの記事を書く(ブログを書くこと自体初めて)ため至らない点もあるだろうが、ご了承いただきたい。

ここまで見ていただきありがとう。