2016-08-09 15 views
-2

すみません。 JUnitテストの初心者です。以下のメソッドに対してJUnitテストを書くにはどうしたらいいですか?

これは、(私はまったく変更することはできません)私の方法であって、任意のパラメータを持っていないとき

public class HalfNumber { 

    private int value = 41; 

    public HalfNumber(){ 
    }; 

    public int getHalfValue() { 
     int halfValue = value/2 + value % 2; //gets rounded 

     return halfValue; 
    } 
} 

にはどうすればgetHalfValue()メソッド用のテストを書くことができますが、それはからの値をとりますクラス変数?

+1

通常の実行で 'value'はどのように設定されますか? – nhouser9

+0

こんにちは@nhouser9 !!!ここでの値は、トレースすることが困難な他の操作から定義されます。私はこのクラスが狂っていることを知っていますが、私はそれらを書いていないので、私もそれらを変更することはできません。しかし、この値の数は任意の整数にすることができます。 – GRP

+1

このクラスは、リフレクションを使用してフィールドを設定し、個々のメソッドをテストしない限り、テストできません。しかし、それは変です。クラスの振る舞い全体をテストすることをお勧めしますが、複数の懸念事項を念頭に置いて書かれている場合、これは難しく、正しいことをするのはおそらく不可能です(テスト可能ではあるがひどく醜い)。 – mszymborski

答えて

0

こんにちは@allとあなたの応答をありがとう。これは上の問題の回避策として見つけた解決策についてすばやく頭を上げています。通信チームのテストクラスを作成するときにJavaクラスを変更できない場合、これは同じような状況に直面した皆さんにとってうまくいきたいと思います。

public class TestHalfNumber { 

private HalfNumber classUnderTest; 

Map<String,Object> bindingsMap; 

protected Map<String, String> captured; 
@Mock 
protected Resource resource;  
@Mock 
protected ResourceResolver resourceResolver; 
@Mock 
protected SlingHttpServletRequest sServletReq; 

// --------------------------------------------------------------------------- 
/** 
* @param object 
*   of type WCMUsePojo. This object cannot be null. 
* @param map 
*   containing properties that needs to be initialized with 
*   WCMUsePojo 
*/ 
// --------------------------------------------------------------------------- 
public void init(WCMUsePojo obj, Map<String, Object> map) { 
    Map<String, Object> staticMap = new HashMap<String, Object>(); 

    staticMap.put("resource", resource); 

    staticMap.put("request", sServletReq); 

    if (map != null) 
     staticMap.putAll(map); 

    if (obj != null) 
     obj.init(new SimpleBindings(staticMap)); 
    else 
     throw new IllegalArgumentException("Subclass object is null "); 
} 


@Before 
public void setUp() 
{ 
    MockitoAnnotations.initMocks(this); 
    classUnderTest = new HalfNumber(); 
    when(sServletReq.getResourceResolver()).thenReturn(resourceResolver); 
} 

// --------------------------------------------------------------------------- 
/** 
* Test case for GetHalfValue 
*/ 
// --------------------------------------------------------------------------- 
@Test 
public void testGetHalfValue() throws Exception{ 

    int inputValue = 5; 
    int expected = 3; 

    bindingsMap = new HashMap<String,Object>(); 

    //Here is where we change the 4 by a 5 or any other value to test. 
    bindingsMap.put("value",inputValue); 

    init(classUnderTest,bindingsMap); 
    int result = classUnderTest.getHalfValue(); 
    Assert.assertEquals(expected,result); 

    } 

} 
0

これは有効なテストのようになります。ところで、目的

@Test 
public void numberTest() { 
    assertEquals(21, new HalfNumber().getHalfValue()); 
} 

とクラスのデザインは、私が今まで見た中で最悪の一つです。

+0

ありがとうございます!私はすでにこのようなものを持っていました。私の問題は、値(この例では41)がその巨大なメソッドの上の何か他の計算の結果であることに気がついたときに始まります(私は恐ろしいですが、私はそれを書きませんでした。私の仕事はここでJava単体テストをカバーするだけです)。だから、ここで私の次の質問は、その変数の値をクラス内で直接模擬する方法です。あなたの解決策では、21が常に結果になるので、私はテストクラスから直接値を設定したいと思います。 – GRP

+0

"value"属性を変更するメソッド、またはリフレクションAPIを介してアクセスする必要があるメソッドがあります。しかし、目的は何ですか?クラスは固定された "value"属性を持つように設計されているため、強制的に変更しようとすると意味がありません。 – Matt

関連する問題