2016-12-01 4 views
2

ich eine Situation, wo ich brauche eine Funktion zu testen, aber die Klasse hat wie diese injizierte String-Wert:Inject String in Klasse Guice für JUnit-Test

public class SomeClass{ 
    @Inject 
    @Named("api") 
    private String api; 

    public Observable<String> get(String uuidData){ 
     //do something with "api" variable 
    } 
} 

Nun, wie ich spritze aus meinem JUnit-Test Fall? Ich benutze auch Mockito, aber es erlaubt mir nicht, primitive Typen zu verspotten.

Antwort

4

Es sieht aus wie gibt es zwei Möglichkeiten:

Option 1: Injektion im @Before Ihrer JUnit-Test einrichten

//test doubles 
String testDoubleApi; 

//system under test 
SomeClass someClass; 

@Before 
public void setUp() throws Exception { 
    String testDoubleApi = "testDouble"; 
    Injector injector = Guice.createInjector(new Module() { 
     @Override 
     protected void configure(Binder binder) { 
      binder.bind(String.class).annotatedWith(Names.named("api")).toInstance(testDouble); 
     } 
    }); 
    injector.inject(someClass); 
} 

Option 2: Refaktorieren Klassenkonstruktors zu verwenden Injektion

public class SomeClass{ 
    private String api; 

    @Inject 
    SomeClass(@Named("api") String api) { 
     this.api = api; 
    } 

    public Observable<String> get(String uuidData){ 
     //do something with "api" variable 
    } 
} 

Jetzt Ihre @Before Methode wird wie folgt aussehen:

//test doubles 
String testDoubleApi; 

//system under test 
SomeClass someClass; 

@Before 
public void setUp() throws Exception { 
    String testDoubleApi = "testDouble"; 
    someClass = new SomeClass(testDoubleApi); 
} 

Von den beiden Möglichkeiten, ich würde sagen, die zweite vorzuziehen ist. Sie können sehen, es führt zu viel weniger Kesselplatte und die Klasse kann auch ohne Guice getestet werden.

Verwandte Themen