java - 如何模拟@Inject 接口(interface)

标签 java unit-testing junit mockito

我有这个服务接口(interface)

public interface ABC {
    public String getAbc();
}

我有这个使用这个服务的 Controller
public class Do {
    @Inject ABC abc;

    public String doAbc() {
       String a = abc.getAbc();
    }
}

在我的单元测试中,我希望能够模拟出这个 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...
   }
}

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

最佳答案

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());
    }

}

输出是:
Injected abc is not null
null

关于java - 如何模拟@Inject 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35325403/

相关文章:

java - 在 gradle mutlimodule 项目中使用 Jacoco 离线检测实现跨模块代码覆盖

python - python中的单元测试以存入金额

java - JUnit 在预期异常后继续断言

database - 单元测试数据库交互器

c# - JSON.NET 序列化在 ApiController 中的行为不同

java - 应用程序无法加载application.yml文件

java - 单元测试中是否使用了 Spring Framework?

Java for循环打印一年中的每个月

java - Android:不允许用户在 EditText 中选择光标位置?

java - 如何使 JPanel 可滚动?