【问题标题】:How to mock an object with Guice @Inject?如何使用 Guice @Inject 模拟对象?
【发布时间】:2022-02-02 18:33:51
【问题描述】:

我有一个 A 类和一个 B 类。

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

测试类看起来像 -

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

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

问题是 B 类没有被嘲笑。在测试类中,每当调用 B 的方法时都会出现 NullPointerException。我无法对 A 类进行更改。请帮助我如何成功模拟 B 类?

【问题讨论】:

    标签: java mockito guice


    【解决方案1】:

    我假设在您的情况下,不是 B 没有被模拟,而是它没有被注入 a

    注入它的一种方法是在测试中使用Module 创建一个Guice Injector,这会将要注入的类(在您的情况下为B)绑定到@987654326 的具体实例@,然后使用Injector#injectMembers(a)将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());
      }
    }
    

    如果您需要更频繁地执行此操作而不是仅针对一个测试,请查看this 问题的答案,其中讨论了单元测试中 Guice 依赖注入的不同方式。

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      相关资源
      最近更新 更多