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 注入接口。
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)
| 归档时间: |
|
| 查看次数: |
18726 次 |
| 最近记录: |