簡體   English   中英

如何使用 Guice @Inject 模擬 object?

[英]How to mock an object with Guice @Inject?

我有一個 class A 和一個 class B。

public class A{
    @Inject // Guice Inject
    private B b;
}

測試 class 看起來像 -

public class ATest{
    private B b;
    
    private A a;

    @Before
    public void setup() {
        b = Mockito.mock(b.class);
        a = new A();
    }
}

問題是 class B 沒有被嘲笑。 在測試 class 中,每當調用 B 的方法時都會出現 NullPointerException。 我無法對 class A 進行更改。請幫助我了解如何成功模擬 class B?

一種方法是使用Module在測試中創建一個 Guice Injector ,這會將要注入的 Class 綁定到B的具體實例,然后使用Injector#injectMembers(a) B b變成a .

工作示例:

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;

class InjectableTest {
  private static class Service {
    @Inject
    private Object obj;

    public Object getObj() {
      return obj;
    }
  }

  private final Object obj = Mockito.mock(Object.class);
  private final Injector injector = Guice.createInjector(new AbstractModule() {
    @Override
    protected void configure() {
      bind(Object.class).toInstance(obj);
    }
  });

  @Test
  void t() {
    Service s = new Service();
    injector.injectMembers(s);
    Assertions.assertEquals(obj, s.getObj());
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM