2016-12-01 1 views
2

У меня есть ситуации, когда мне нужно, чтобы проверить функцию, но класс придала значение строки, как это:Вводят строку в класс с помощью Guice для тестирования JUnit

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

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

Теперь, как я впрыснуть это от моего JUnit теста дело? Я также использую Mockito, но это не позволяет мне издеваться над примитивными типами.

ответ

4

Похоже, есть два варианта здесь:

Вариант 1: Настройка инъекции в @Before вашего теста JUnit

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

Вариант 2: реорганизовать класс использовать конструктор впрыск

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

Теперь ваш @Before метод будет выглядеть следующим образом:

//test doubles 
String testDoubleApi; 

//system under test 
SomeClass someClass; 

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

Из двух вариантов, я бы сказал, что второе является более предпочтительным. Вы можете видеть, что это приводит к значительно меньшей котельной плите, и класс можно протестировать даже без Guice.