如何模拟 @Inject 接口

Chu*_*urk 5 java junit unit-testing mockito

我有这个服务接口

public interface ABC {
    public String getAbc();
}
Run Code Online (Sandbox Code Playgroud)

我有一个使用此服务的控制器

public class Do {
    @Inject ABC abc;

    public String doAbc() {
       String a = abc.getAbc();
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的单元测试中,我希望能够模拟这个 ABC,而不必提供实际的实现。这是有效的:

public class TestDo {
   @Mock
   private Do do;

   @Mock
   private ABC abc;

   @Before
   public void init() {
       MockitoAnnotations.initMocks(this);
       do.abc = abc;
   }

   @Test
   public void testDo() {
       when(do.doAbc()).thenCallRealMethod();
       do.doAbc();
       assertSomething...
   }
}
Run Code Online (Sandbox Code Playgroud)

但我不想做的是do.abc = abc;,从我所有的搜索来看,为了执行@InjectMock,我需要提供一个具体的类。有没有一种方法可以让我使用该接口,但又能够将模拟接口注入到 do 中,而不需要在 Do 类中暴露我的 ABC 注入?我想让 ABC 成为私有变量,并且仍然能够通过 Mockito 注入接口。

Rus*_*tam 5

public interface ABC {
    public String getAbc();
}

public class Do {

    @Inject
    ABC abc;

    public String doAbc() {
        System.out.println("Injected abc is " + (abc == null ? "null" : "not null"));
        return abc.getAbc();
    }

}


public class TestDo {
    @Mock
    private ABC abc;

    @InjectMocks
    private Do ddo;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void simpleTest() {
        System.out.println(ddo.doAbc());
    }

}
Run Code Online (Sandbox Code Playgroud)

输出是:

Injected abc is not null
null
Run Code Online (Sandbox Code Playgroud)