2つのオブジェクトをJUnitと比較すると奇妙な動作が見られる

Ulrich:

私はクラスのJUnitテストメソッドを書いていますAbsorptionScheme。これは、いわゆるを受け取り、AbsorptionBlocksそれらを吸収ブロックの配列にソートします。私がテストしたかったのは、ソートがうまく機能するかどうかです。そのため、2つの__________________________________________________________________________________________の2つの吸着オブジェクトを作成し、両方に同じ吸収ブロックを設定しましたが、最初の1つは並べ替えられておらず、2番目は事前に並べ替えられています。次に、JUnitのassertEquals(Object expected, Object actual)関数を使用して、両方のAbsorbSchemeオブジェクトが同一であることを確認したいと思いましたtoStingメソッドは同一の文字列を返しますが、JUnitはまだ両方のオブジェクトが同一ではないことを教えてくれます。

JUnits評価は次のとおりです。

java.lang.AssertionError: expected: info.rueth.fpucalculator.calc.AbsorptionScheme<Absorption Scheme: (1FPU -> 3h) (2FPU -> 4h) (3FPU -> 5h) (4FPU -> 6h) (6FPU -> 8h)> but was: info.rueth.fpucalculator.calc.AbsorptionScheme<Absorption Scheme: (1FPU -> 3h) (2FPU -> 4h) (3FPU -> 5h) (4FPU -> 6h) (6FPU -> 8h)>
Expected :info.rueth.fpucalculator.calc.AbsorptionScheme<Absorption Scheme: (1FPU -> 3h) (2FPU -> 4h) (3FPU -> 5h) (4FPU -> 6h) (6FPU -> 8h)> 
Actual   :info.rueth.fpucalculator.calc.AbsorptionScheme<Absorption Scheme: (1FPU -> 3h) (2FPU -> 4h) (3FPU -> 5h) (4FPU -> 6h) (6FPU -> 8h)>

私が見ることができる唯一の違いは、「期待される」文字列の最後に空白があることですが、「実際の」文字列の最後にはありません。

これが私がテストしたい私のクラスです:

package info.rueth.fpucalculator.calc;

import java.util.Arrays;

/**
 * Holds an absorption scheme, connecting FPUs to recommended absorption times.
 */
public class AbsorptionScheme {
    private AbsorptionBlock[] absorptionBlocks;

    AbsorptionScheme() {
        // Create empty array
        absorptionBlocks = new AbsorptionBlock[0];
    }

    /**
     * Adds a new absorption block to the absorption scheme.
     * @param maxFPU The maximum FPU for the absorption time
     * @param absorptionTime The absorption time for that FPU.
     */
    public void addBlock(int maxFPU, int absorptionTime) {
        // Copy existing array into new array with one more empty element at the end ...
        AbsorptionBlock[] newArray = Arrays.copyOf(absorptionBlocks, absorptionBlocks.length + 1);

        // ... and put new AbsorptionBlock into that empty element
        newArray[absorptionBlocks.length] = new AbsorptionBlock(maxFPU, absorptionTime);

        // Sort by maxFPU and replace object variable
        Arrays.sort(newArray, new AbsorptionBlockSorter());
        absorptionBlocks = newArray;
    }

    /**
     * Picks the absorption time associated to the number of FPUs, e.g.:
     * <p>absorptionScheme: 0-1 FPU - 3 hours; 1-2 FPU - 4 hours; 2-3 FPUs - 5 hours; 3-4 FPUs - 6 hours; >4 FPUs - 8 hours</p>
     * <p>The fpu value is commercially rounded to 0 digits, i.e. 2.49 will be rounded to 2, 2.50 will be rounded to 3.</p>
     * <p>If the fpu value is beyond the last scheme block, the time of the last scheme block in the array is returned.</p>
     * 
     * @param fpus The calculated FPUs.
     * @return The associated absorption time.
     */
    public int getAbsorptionTime(double fpus) {
        // Round up the fpus - it's more secure to get a longer insulin interval
        long roundedFPUs = Math.round(fpus);

        // Find associated absorption time
        for (int i = 0; i < absorptionBlocks.length; i++) {
            if (roundedFPUs <= absorptionBlocks[i].getMaxFPU()) {
                return absorptionBlocks[i].getAbsorptionTime();
            }
        }

        // Seems to be beyond the last block, so return time of the last block
        return absorptionBlocks[absorptionBlocks.length - 1].getAbsorptionTime();
    }

    @Override
    public String toString() {
        String returnString = "Absorption Scheme:";
        for (int i = 0; i < absorptionBlocks.length; i++) {
            returnString += " (" + absorptionBlocks[i].getMaxFPU() + "FPU -> " + absorptionBlocks[i].getAbsorptionTime() + "h)";
        }
        return returnString;
    }
}

そして、これが私のテストコードです:

    @Test
    public void addBlock() {
        // Create absorption scheme
        AbsorptionScheme absorptionSchemeActual = new AbsorptionScheme();

        // Add absorption blocks - unsorted on purpose to test sorting!
        absorptionSchemeActual.addBlock(2, 4);
        absorptionSchemeActual.addBlock(3, 5);
        absorptionSchemeActual.addBlock(6, 8);
        absorptionSchemeActual.addBlock(1, 3);
        absorptionSchemeActual.addBlock(4, 6);

        // Create another absorption scheme ...
        AbsorptionScheme absorptionSchemeExpected = new AbsorptionScheme();

        // ... and add blocks, this time sorted!
        absorptionSchemeExpected.addBlock(1, 3);
        absorptionSchemeExpected.addBlock(2, 4);
        absorptionSchemeExpected.addBlock(3, 5);
        absorptionSchemeExpected.addBlock(4, 6);
        absorptionSchemeExpected.addBlock(6, 8);

        // Assert both schemes: They should be identical!
        assertEquals(absorptionSchemeExpected, absorptionSchemeActual);
    }

違いはわかりません。何が悪いのでしょうか。

プラサードカルナゴダ:

assertEquals(Object, Object)メソッドはequals()、与えられたオブジェクトを使用して等価性をチェックします。クラスでオーバーライドequals()ていないためAbsorptionScheme、のequals()実装java.lang.Objectはによって使用されassertEquals()ます。

Object.equals()true2つのオブジェクトが同じ場合にのみ返されます(同じオブジェクト参照)。以下のJavadocのテキストを参照してくださいObject.equals()

クラスObjectのequalsメソッドは、オブジェクトに対して最も識別可能な同値関係を実装します。つまり、null以外の参照値xおよびyの場合、このメソッドは、xとyが同じオブジェクトを参照する場合(x == yの値がtrueの場合)にのみtrueを返します。

あなたのテストケースでは、absorptionSchemeActualそしてabsorptionSchemeExpected2つの異なるオブジェクトです。したがってassertEquals()失敗します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

同じオブジェクトを指す2つのオブジェクトインスタンスの1つが、それらのいずれかにNULLを割り当てると、異なる動作をするのはなぜですか?

分類Dev

2つのオブジェクトがangular.equalsと等しく比較されない理由をどのように見つけることができますか?

分類Dev

-COMオブジェクトから変数を設定するときのErrorActionの奇妙な動作

分類Dev

別のオブジェクトの変数からオブジェクトの変数を設定するときの奇妙なPythonの動作

分類Dev

Vueのオブジェクトの配列からオブジェクトを削除するときの奇妙な動作

分類Dev

Javascriptでオブジェクトをキーとして使用するときの奇妙な動作

分類Dev

関数オブジェクトを作成するときの奇妙なテンプレート文字列の動作

分類Dev

javascript引数オブジェクトを変更しようとすると、なぜこれほど奇妙な動作をするのですか?

分類Dev

2つのNSDateオブジェクトの同等性を比較すると、予期しない結果が得られます

分類Dev

dictから継承するときの一貫性のないオブジェクト比較動作

分類Dev

dictから継承するときの一貫性のないオブジェクト比較動作

分類Dev

オブジェクトをスケーリングするときの非常に奇妙な動作

分類Dev

オブジェクトをスケーリングするときの奇妙な動作

分類Dev

同じオブジェクトを参照する値が異なる2つのポインターを持つことは未定義の動作ですか?

分類Dev

Python-2つの同一のオブジェクトを比較するとFalseが返されますか?

分類Dev

2つの参照型のネストされたオブジェクトと動的オブジェクトの値を比較する方法

分類Dev

2つの異なるオブジェクトをjasmine.toEqualと比較します。一方のオブジェクトは空で、もう一方のオブジェクトにはシンボルであるキーがありますが、なぜそれらが等しいと言うのですか?

分類Dev

ボックス化されたトレイトオブジェクトに送信トレイトを追加するときの奇妙な動作

分類Dev

2つのオブジェクトを比較するときにJUnitassertEquals()が機能しない

分類Dev

2つのオブジェクトを比較するときにJUnitassertEquals()が機能しない

分類Dev

JavaScriptオブジェクトで奇妙な動作をするSetInterval

分類Dev

2つのオブジェクトを比較する際の「==」の動作ロジックは何ですか?

分類Dev

サブジェクトをサブスクライブするときの奇妙なTestObserverの動作

分類Dev

===操作で2つのオブジェクトを比較するとfalseが返されるのはなぜですか

分類Dev

PHP匿名オブジェクトの文字列を連結する奇妙な動作

分類Dev

2つの例外オブジェクトを比較するには、ShouldBeとShouldEqualのどちらが優れていますか

分類Dev

Pythonでクラス属性として別のクラスオブジェクトのリストを使用するときの奇妙な動作

分類Dev

参照をオブジェクトに保存すると、奇妙な結果が得られます

分類Dev

オブジェクトとconsole.logの奇妙な動作

Related 関連記事

  1. 1

    同じオブジェクトを指す2つのオブジェクトインスタンスの1つが、それらのいずれかにNULLを割り当てると、異なる動作をするのはなぜですか?

  2. 2

    2つのオブジェクトがangular.equalsと等しく比較されない理由をどのように見つけることができますか?

  3. 3

    -COMオブジェクトから変数を設定するときのErrorActionの奇妙な動作

  4. 4

    別のオブジェクトの変数からオブジェクトの変数を設定するときの奇妙なPythonの動作

  5. 5

    Vueのオブジェクトの配列からオブジェクトを削除するときの奇妙な動作

  6. 6

    Javascriptでオブジェクトをキーとして使用するときの奇妙な動作

  7. 7

    関数オブジェクトを作成するときの奇妙なテンプレート文字列の動作

  8. 8

    javascript引数オブジェクトを変更しようとすると、なぜこれほど奇妙な動作をするのですか?

  9. 9

    2つのNSDateオブジェクトの同等性を比較すると、予期しない結果が得られます

  10. 10

    dictから継承するときの一貫性のないオブジェクト比較動作

  11. 11

    dictから継承するときの一貫性のないオブジェクト比較動作

  12. 12

    オブジェクトをスケーリングするときの非常に奇妙な動作

  13. 13

    オブジェクトをスケーリングするときの奇妙な動作

  14. 14

    同じオブジェクトを参照する値が異なる2つのポインターを持つことは未定義の動作ですか?

  15. 15

    Python-2つの同一のオブジェクトを比較するとFalseが返されますか?

  16. 16

    2つの参照型のネストされたオブジェクトと動的オブジェクトの値を比較する方法

  17. 17

    2つの異なるオブジェクトをjasmine.toEqualと比較します。一方のオブジェクトは空で、もう一方のオブジェクトにはシンボルであるキーがありますが、なぜそれらが等しいと言うのですか?

  18. 18

    ボックス化されたトレイトオブジェクトに送信トレイトを追加するときの奇妙な動作

  19. 19

    2つのオブジェクトを比較するときにJUnitassertEquals()が機能しない

  20. 20

    2つのオブジェクトを比較するときにJUnitassertEquals()が機能しない

  21. 21

    JavaScriptオブジェクトで奇妙な動作をするSetInterval

  22. 22

    2つのオブジェクトを比較する際の「==」の動作ロジックは何ですか?

  23. 23

    サブジェクトをサブスクライブするときの奇妙なTestObserverの動作

  24. 24

    ===操作で2つのオブジェクトを比較するとfalseが返されるのはなぜですか

  25. 25

    PHP匿名オブジェクトの文字列を連結する奇妙な動作

  26. 26

    2つの例外オブジェクトを比較するには、ShouldBeとShouldEqualのどちらが優れていますか

  27. 27

    Pythonでクラス属性として別のクラスオブジェクトのリストを使用するときの奇妙な動作

  28. 28

    参照をオブジェクトに保存すると、奇妙な結果が得られます

  29. 29

    オブジェクトとconsole.logの奇妙な動作

ホットタグ

アーカイブ