2016-03-24 2 views
0

Ich habe eine Klasse, die statische Variablen während der Initialisierung zugewiesen hat. Ich möchte Komponententests für diese Klasse schreiben, indem ich Werte für diese statische Variable ändere. Unten ist ein einfacher Code mein SzenarioUnit Testing mit dem Ändern von statischen Variablen während der Initialisierung

Klasse Test zu erklären:

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; 
    } 
} 

Stützklasse:

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; 
    } 
} 

Prüfklasse:

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()); 
    } 
} 

Gibt es eine Möglichkeit zu machen Beide Tests sind erfolgreich. Derzeit erhalte ich einen Fehler für testDymanic() sagte:

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

Vielen Dank im Voraus!

Antwort

2

Die Verwendung eines veränderlichen Singleton in einem Test ist ein bekanntes Problem. Sie müssen den Zustand des Singleton zwischen den Tests zurücksetzen, noch besser, verwenden Sie kein Singleton in Ihren Tests.

Sie tun könnte so etwas wie:

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 nur einmal pro Durchlauf initialisiert wird; Sie können es nicht innerhalb derselben JVM erneut initialisieren. Gibt es eine Möglichkeit, beide Tests erfolgreich zu machen? Sicher, es gibt unzählige Möglichkeiten. Aber das hängt davon ab, was Sie versuchen zu testen, was aus Ihrem Beispiel nicht ganz klar ist.