2016-12-09 8 views
-1

Я следовал этот учебник Why should we use dependency injection? и у меня есть эта диаграмма классов Class DiagramОшибка тестирования Guice инъекции dependeing

и у меня есть следующий код JUnit для тестирования модели.

public class TestPerson { 
    private Injector injector; 
    @Before 
    public void init(){ 
     injector = Guice.createInjector(new AbstractModule(){ 
      @Override 
      protected void configure() { 
       bind(MessageService.class).to(MockService.class); 
      } 
     }); 
    } 
    @Test 
    public void tetGreetFriend(){ 
     Person person = injector.getInstance(Person.class); 
     person.gretFriends(); 
     MockService mockService = injector.getInstance(MockService.class); 
     assertEquals("Hello my Friend", mockService.msg); 
    } 
} 

, когда я начала теста я получаю следующую ошибку

java.lang.AssertionError: expected:<hello world> but was:<null> 

то, что будет проблема моего кода. Я новичок в IoC и DI

+0

Пожалуйста, поделитесь кодом для связанных классов, а не диаграммой – nullpointer

+0

. Кроме того, сообщение об ошибке противоречит вашему коду с точки зрения 'ожидаемого <>' в 'Assert' – nullpointer

ответ

0

Я не знаю, что такое гусь, только весна DI. Но вы, возможно, забыли @inject

@Inject 
public Person(MessageService messageService){ 
    this.messageService = messageService; 
} 

в вашем классе Person? И как у вашего MockService? В учебнике они используются

public class EmailService implements MessageService { 
    @Override 
    public void sendMessage(String subject, String message){ 
     System.out.printf("Email: %s, %s%n", subject, message); 
    } 
} 

Вы должны написать полный код, чтобы было легче найти проблемы.

+0

. У меня есть андрограмма и код, который является копией того, что в учебнике :) Вот почему я опубликовал ссылку – test11

+1

@ test11, даже если вы скопируете какой-то код, возможно, вы сделали одну ошибку при копировании, из-за чего произошла ошибка. Вот почему нам нужно, чтобы вы копировали свой фактический код. –

1

Причина, по которой тестовый модуль терпит неудачу, потому что его намерение состоит в том, чтобы проверить побочный эффект на MockService от вызова greetFriend() но побочный эффект возникает на другом экземпляре MockService из одного в тесте:

@Test 
public void tetGreetFriend(){ 
    Person person = injector.getInstance(Person.class); 
    //one instance of MockService is being ^^ instantiated for injection into Person 

    person.greetFriend(); 
    MockService mockService = injector.getInstance(MockService.class); 
    //a distinct instance of MockService ^^ 

    assertEquals("Hello my Friend", mockService.message); 
    } 
} 

Чтобы предотвратить это, вы можете использовать аннотацию @Singleton. Это будет означать, что инжектор Guice не будет вводить более одного экземпляра этой зависимости:

@Singleton 
public class MockMessageService implements MessageService { 

    public String subject; 
    public String message; 

    @Override 
    public void sendMessage(String subject, String message) { 
    this.subject = subject; 
    this.message = message; 
    } 
} 

Испытание теперь будет проходить.

+0

по-прежнему та же ошибка – test11

+0

Я не уверен, что вас тогда устраивает - я копирую и вставляю код, делаю небольшую модификацию, и он запускается и передается на моем компьютере. –