テストメソッド
テストメソッドを使いプログラムを実行させたいのですが、テストメソッドにエラーが出て正常にプログラムが動くかどうか調べられません。
問題は、配列0の数字を、int型のnumShiftsで与えられた数字の回数だけ一番後ろへ移動させ、それ以外の配列の数字を左へシフトさせます。
つまり、一度配列0の中身を一番後ろに持っていくと、配列1の数字が配列0にくるので、それをまた一番後ろにもって行きます。
そしたら配列2の数字が配列0に来ます。それをまた一番後ろにもって行きます。それをnumShifts回繰り返します。
例)
({1,2,3,4,5,6,7}, 3) 3回移動→ {4,5,6,7,1,2,3}
({1,2,3,4,5,6,7}, 0) 0回移動→ {1,2,3,4,5,6,7}
({1,2,3}, 5) 5回移動→ {3,1,2}
プログラムは以下のように組みました。
public class ArrayFun {
public void shiftNTimes(int[] array, int numShifts) {
for (int i = 0; i < numShifts; i++) { //numShifts回繰り返す
for (int j = 0; j < array.length-1; j++) { //配列をシフト
int temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
}
}
}
}
テストメソッドは以下です。
import static org.junit.Assert.*;
import org.junit.Test;
public class ArrayFunTest {
@Test
public void testshiftNTimes() {
ArrayFun af = new ArrayFun();
int[] a1 = { 1, 2, 3, 4, 5, 6, 7 };//元の配列
int[] a2 = { 1, 2, 3, 4, 5, 6, 7 };//元の配列
int[] a3 = { 1, 2, 3 };//元の配列
int[] a4 = { 4, 5, 6, 7, 1, 2, 3 };//シフト後の配列
int[] a5 = { 1, 2, 3, 4, 5, 6, 7 };//シフト後の配列
int[] a6 = { 3, 1, 2 };//シフト後の配列
assertEquals(a4, af.shiftNTimes(a1, 3));
assertEquals(a5, af.shiftNTimes(a2, 0));
assertEquals(a6, af.shiftNTimes(a3, 5));
}
}
エラーは、assertEqualsに赤線が出てしまうことです。
このタイプのAssertでのassertEquals(Object, Object)は、(int[], void)に適切ではないと表示されます。
他のテストメソッドではこのようなエラーは出ないのですが・・・。どなたか解決方法をご存知であれば宜しくお願いします。
お礼
なんかすごいですね…。 ライブラリの中身を変更するという考えは思い浮かびませんでした。 …で、試してみたのですが、うまく行きませんでした。コンストラクタにシスアウトを記述するとテストメソッド実行前にコンストラクタがテストメソッド分呼び出されていました。 私の記述ミスである可能性もあるので、もう少しゆっくり試してみます。ありがとうございました。 ちなみに困っていた現象は >Springを利用していて初期化にメモリを結構使う という部分で、使用するクラスをすべてインスタンスとして持つApplicationContextと呼んでいるインスタンスが10MBを超え、テストメソッドが50を超える場合に、実行メモリを500MBにしてもメモリが不足したという現象でした。 で、実はこの件に関しては、static変数に記述し、スレッドをたくさん作られてもインスタンスが1つしか存在しないようにすることにより回避することができました。 しかし、今回の質問の趣旨のJUnitの遅延初期化の話も将来的に使うかもしれない部分であるので、もう少し調べてみたいと思っています。
補足
記述の通りでできました。 エクリを使用していたため、複数のJUnitjarが存在していたのに気づかず、1つだけ消してそれで全て消したつもりになっていたことが原因でした。 kazsharpさんありがとうございました。