2016-03-24 4 views
0

初期化中に静的変数が割り当てられたクラスがあります。この静的変数の値を変更して、このクラスの単体テストを作成したいと思います。ユニット初期化中に静的変数を変更してテストする

public class Hello { 
private final static String HELLO_FINAL = "Hello " + HelloTo.getInstance().getHelloTo(); // I would like to modify this value between tests 

    public String sayHello() { 
    return HELLO_FINAL; 
    } 
} 

サポートクラス:

public class HelloTo { 
    private String helloTo = "World"; 
    private static HelloTo singleton = new HelloTo(); 
    private HelloTo() {} 
    public static HelloTo getInstance() { 
    return singleton; 
    } 
    public void setHelloTo(String helloTo) { 
    this.helloTo = helloTo; 
    } 
    public String getHelloTo() { 
    return helloTo; 
    } 
} 

Testクラス:

import org.junit.Assert; 
import org.junit.Test; 
public class HelloTest { 
    @Test 
    public void testDefault() { 
    Assert.assertEquals("Hello World", new Hello().sayHello()); 
    } 
    @Test 
    public void testDynamic() { 
    HelloTo.getInstance().setHelloTo("My name"); 
    Assert.assertEquals("Hello My name", new Hello().sayHello()); 
    } 
} 

作るための方法があり、以下のテストに私のシナリオ

クラスを説明するための簡単なコードです両方のテストが成功した。現在、私は言って)(testDymanicのための失敗を取得:

org.junit.ComparisonFailure: expected:<Hello [World]> but was:<Hello [My name]> 

感謝を事前に!

答えて

2

テストで可変シングルトンを使用することは、既知の問題です。テスト間でシングルトンの状態をリセットする必要があります。テストでシングルトンを使用しないでください。

あなたのような何かを行うことができます:

public enum HelloTo { 
    INSTANCE; 
    private String helloTo = "World"; 
    public void reset() { 
    setHelloTo("World"); 
    } 
    public void setHelloTo(String helloTo) { 
    this.helloTo = helloTo; 
    } 
    public String getHelloTo() { 
    return helloTo; 
    } 
} 

public class Hello { 
    public static String sayHello() { 
    // has to be dynamic as helloTo can change. 
    return "Hello " + HelloTo.INSTANCE.getHelloTo(); 
    } 
} 

public class HelloTest { 
    @Before 
    public void setUp() { 
    HelloTo.INSTANCE.reset(); 
    } 
    @Test 
    public void testDefault() { 
    Assert.assertEquals("Hello World", Hello.sayHello()); 
    } 
    @Test 
    public void testDynamic() { 
    HelloTo.INSTANCE.setHelloTo("My name"); 
    Assert.assertEquals("Hello My name", Hello.sayHello()); 
    } 
} 
0

HELLO_FINALのみ実行ごとに一度初期化されます。同じJVM内で再初期化することはできません。両方のテストを成功させる方法はありますか?確かに、無数の方法があります。しかし、それはあなたがテストしようとしているものに依存しますが、あなたの例からは完全には分かりません。

関連する問題