2016-12-09 31 views
-1

我以下這個教程Why should we use dependency injection?和我有這個類圖 Class Diagram錯誤檢測吉斯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'中的'expected <>' – nullpointer

回答

0

我不知道guice,只有泉DI。但你可能已經忘記了你的Person類中的@inject

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

? 關於你的MockService?在本教程中,他們使用

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

你應該張貼的完整代碼,使得它更容易發現問題。

+0

我有thr prober註解和代碼是什麼的副本在教程:)這就是爲什麼我已經發布鏈接 – test11

+1

@ test11即使你複製一些代碼,你可能做了一個錯誤,而複製,使錯誤發生。所以這就是爲什麼我們需要你複製你的實際代碼。 –

1

該單元測試失敗的原因是因爲它的目的是從主叫greetFriend()測試上的MockService副作用但是從一個在測試上的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

我不知道什麼會滿足你然後 - 我複製並粘貼你的代碼,進行了小小的修改,它運行並通過我的電腦。 –